Dynamics365 Javascript実装時の「Web resource method does not exist」問題
みなさん、こんにちは。
今回は、Dynamics365において、Javascriptでカスタム機能を作りこむ際に、おそらく誰もが一度はぶつかるであろう「Web resource method does not exist」エラーの問題について取り上げます。
結論から言いますと、Javascriptのソースを書く際に、(主として)括弧の対応を正しく書いていないことが原因で、このような文言のエラーが発生するという現象です。
発生現象の確認
簡単な例を作って実験します。
適当なフォーム画面上に、2つのオプション型の項目「1」「2」と、1行テキスト型の「メッセージ」を配置します。
・「1」という項目に、OnChangeイベントとして、Javascriptの関数「test1」を設定します。
・「2」という項目に、OnChangeイベントとして、Javascriptの関数「test2」を設定します。
・test1とtest2のソースは以下のようになっています。(2つの関数は、同じJSファイル「test.js」にまとめて記述しています)
ソースプログラムの内容としては、
・test1が呼ばれるとメッセージ欄に「関数test1が呼び出されました」という文字列をセット
・test2が呼ばれるとメッセージ欄に「関数test2が呼び出されました」という文字列をセット
というだけの、単純なものです。
これを実際に動かしてみます。
ユーザーが画面上で「1」という項目のチェックをつける(または外す)と、メッセージ欄に「関数test1が呼び出されました」とセットされます。
画面上で「2」という項目のチェックをつける(または外す)と、メッセージ欄に「関数test2が呼び出されました」とセットされます。
ここまでは、正常な動作です。
ここで、先ほどのソースの「test2」関数の中で、以下の位置にある、閉じる括弧「)」をつけ忘れたとします。
(ここまでシンプルなソースでは、なかなか間違えないと思いますが、あくまで単純化した例です。実際は、もっと複雑で括弧が何重にも入れ子になったようなソースを相手にする際に、うっかり括弧を忘れてしまうことが起きる訳です。)
以下は、閉じる括弧を削除した状態です。
この、間違った状態のソースをDynamics環境に適用して、画面上で「2」のチェックに触って、test2関数を呼び出そうとすると、以下のようにエラーが出ます。
「Web resource method does not exist:test2」
エラーの意味を考える
このエラーメッセージですが、意味的には、Webリソースにおけるtest2という関数が見つからないということを言っています。
実際、もっと単純なミスとして、「test2」という関数自体をソースに書き忘れているとか、「test2」という関数の名前を書き間違えている場合でも、このエラーが表示されて「test2が見つかりませんよ!」と怒られることになります。
しかし、今回の記事で特に扱いたいのは、
・さっきまでtest2は動いていたはずなのに、test2をちょっと修正したら、このエラーが出るようになってしまった。
・「test2が見つかりません」というけれど、確かにソースファイルにはtest2は書いてあるし、さっきまではtest2が動いていたのだから、test2が見つからないなんてありえない!
というような場合です。
この種の状況に初めて遭遇した人が、エラーメッセージの文章を文字通りに捉えても、真の原因(括弧を忘れている)には辿り着きにくいでしょう。
考え方としては、以下の通りです。
1.test.jsというJavascriptファイルは、構文エラー(括弧を忘れている)を含んでいるため、正常に読み込めない状態である。
↓
2.今、ユーザーが画面上で「2」をクリックすると、Dynamicsは、この項目に対してOnChangeイベントとして紐づけられた「test2」関数を呼び出そうとする。
↓
3.しかし、本来「test2」関数が載っているはずだったtest.jsは正常に読み込まれていないため、Dynamicsは、test2という関数を見つけられない。
↓
4.したがって、「test2という関数が見つかりません」というエラーが出る。
このように、根本原因は構文の間違いなのですが、結果として「関数が見つかりません」というメッセージになるため、慣れないと、メッセージ内容から原因を想像しづらいのです。
このエラーの特徴(厄介なところ)
このエラーの厄介な点として、以下があります。
まず、test2という関数の実行中にエラーになるのではなく、実行する前にエラーが起きるので、デバッグしながら原因を探すということはできません。
さらに、先の例の場合、根本原因を含んでいるのは「test2」という関数の中ですが、この事象は、「test2」関数だけでなく、同じファイルに記載された「test1」関数も巻き添えにします。
実験します。先ほどと同じ、括弧を忘れたソースを適用した状況で、test1関数を呼び出そうとした場合です。
test.jsファイル自体が正常に読み込まれていないので、「test1」関数についても同じエラーが発生するようになります。
しかし、エラーメッセージにtest1と書いてあるからと言って、関数「test1」の部分のソースを一生懸命眺めても、原因は見つかりません。
このエラーが発生した際は、そのソースファイル全体から、原因を見つけなければならないのです。
また今回は、OnChangeイベントの例を示しましたが、もし同じファイルにOnLoad関数を含んでいたりしますと、Javascriptファイルを更新して画面をリロードした瞬間にエラーが発生するようになってしまいます。
(問題が発生していることをいち早く気付ける、とも言えますが…)
このように、「Web resource method does not exist」エラーが発生した際、経験がないと、上記のような特徴に惑わされて、原因の特定に時間がかかってしまうことがありえます。
逆に言うと、過去に引っ掛かった覚えがある人なら、こういった特徴を踏まえて、素早く根本原因に至れる可能性があります。
エラー発生のパターン
このエラーが発生する状況としては、体感としてほとんどの場合が、上記のように「括弧を書き間違えている」場合です。
また、括弧に似た話として、引用符で文字列をくくる際に、引用符を正しく閉じていないという場合もあります。
しがたって、このエラーが出た場合は、真っ先に、括弧や引用符を正しく閉じているかを疑うと良いですが、それ以外のパターンもあります。
筆者が把握している中で、括弧の間違いとはちょっと毛色の違うパターンとして挙げておきたいのは、「予約語を間違えている」ケースです。例として、以下のように「var」を「ver」と書き間違えてしまうと、「Web resource method does not exist」が出ます。
(個人的には、他の言語の癖で「int」型を使ってしまって、このエラーになってしまったという経験もあります・・・)
したがって、「Web resource~」エラーが発生した際は、まず括弧や引用符の間違いを疑ってみるのは有効だと思うのですが、必ずしもそればかりではないということも知っておいて損はないと思います。
原因箇所の探し方
ここまでに触れた特徴を踏まえた上で、このエラーが発生したときに、効率よく原因箇所を探す方法としては、以下が考えられます。
・VisualStudioなど、ソースの構文をチェックできるものを使って、括弧や引用符の誤りを見つけ出す。
・特に、規模の大きいソースを変更する場合は、事前にバックアップをとっておき、エラー発生したら、正常に動いていたころのソースと差分をとって、原因を見つけ出す。
おわりに
「Web resource method does not exist」エラーは、はまり込んでしまうと、それだけでかなり作業時間を食ってしまうことがあります。この状況に遭遇した方が、本ページを参考にしていただいて、いち早く解決していただけると幸いです。