setProxyConfigのエラー処理について

お世話になっております。
APIトークンをProxyで保持したく、setProxyConfigを利用しています。

    const url = kintone.api.url(‘/k/v1/records’, true);

    const header = {

      [‘X-Cybozu-API-Token’]:settingForm.api_token.value

    };

    const body = {};

    // レコード取得

    kintone.plugin.app.setProxyConfig(url, ‘GET’, header, body);

    // レコード更新

    kintone.plugin.app.setProxyConfig(url, ‘PUT’, header, body);

 

上記のように記述しているのですが、以下のエラーメッセージが出てしまうことがあります。

エラー内容
データベースのロックに失敗したため、変更を保存できませんでした。時間をおいて再度お試しください。
(GAIA_DA02 O7JeBobCRX6OETbIhJKc)

このエラーメッセージがalertで出るのですが、一瞬で消えてしまいます。
プログラムの方でエラーをキャッチして、alert画面を出す方法はないでしょうか?
JavaScript APIのガイドラインを拝見しておりますが、返り値なしとなっており、方法がわからない状況です。

ご教授いただけますと幸いです。よろしくお願いします。

woodsnutsさん

お世話になっております。

kintone.plugin.app.setProxyConfig自体は使用したことがなくて詳しくないのですが、kintone REST APIのPUT処理時などに似たようなエラーを経験したことがあります。
アプリの設定変更を複数並列で処理しようとしたときに似たようなエラーが出たため、直列処理に変更することで解消しました。https://developer.cybozu.io/hc/ja/community/posts/208310706/comments/208536326

ご提示いただいたコードでも、kintone.plugin.app.setProxyConfigが並列処理となっているようですね。
片方のkintone.plugin.app.setProxyConfigのsuccessCallback内に、もう片方のkintone.plugin.app.setProxyConfigを記述して直列処理にすることで解消しないでしょうか?
https://developer.cybozu.io/hc/ja/articles/203661160#list2

江田篤史 様
お世話になっております。早々にご連絡いただき、ありがとうございました。

直列処理に修正してみたのですが、データベースエラーが発生しても、successCallbackに入ってしまい、状況が改善されませんでした。実はプロキシへの設定が成功していてもデータベースエラーが表示される場合があるようです。

他にも何か思い当たることがあればご教授いただけると幸いです。引き続きよろしくお願いいたします。

woodsnutsさん

お世話になっております。

左様でしたか…。状況を把握しきれていないので、2点質問よろしいでしょうか?

> 直列処理に修正してみたのですが、データベースエラーが発生して

もしコード内にkintone.plugin.app.setProxyConfigの記述が1箇所だけだったとしても、「データベースのロックに失敗したため、変更を保存できませんでした。時間をおいて再度お試しください。」というエラーが発生するということでしょうか?
よろしければ修正後のコードも見せて頂けるとわかりやすいです。

 

> 実はプロキシへの設定が成功していてもデータベースエラーが表示される場合がある

データベースエラーが表示されている状態でも、下記の2つとも設定が成功するということでしょうか?

// レコード取得
kintone.plugin.app.setProxyConfig(url, 'GET', header, body);
// レコード更新
kintone.plugin.app.setProxyConfig(url, 'PUT', header, body);

江田篤史 様
お世話になっております。今回も早々にご連絡いただき、ありがとうございました。

修正後は以下のようになっております。

//APIトークンはProxyに保存する

    const url = kintone.api.url(‘/k/v1/records’, true);

    const header = {

      [‘X-Cybozu-API-Token’]:settingForm.api_token.value

    };

    setGetProxyConfig(url,header,data);

  }

  function setGetProxyConfig(url,header,data) {

    // レコード取得用APIトークン設定

    kintone.plugin.app.setProxyConfig(url, ‘GET’, header, {},setPutProxyConfig(url,header,data));

  }

  function setPutProxyConfig(url,header,data) {

    // レコード更新用APIトークン設定

    kintone.plugin.app.setProxyConfig(url, ‘PUT’, header, {},setConfig2(data));

  }

  function setConfig2(data) {

    //kintone.plugin.app.setConfig(data);

    const json = JSON.stringify(data);

    kintone.plugin.app.setConfig({json: json},setConfig3);

  }

  function setConfig3() {

    alert(‘保存が完了しました。’);

  }

 

デバックモードで実行すると、setConfigでデータベースエラーが発生することがありましたので、こちらにもsuccessCallbackを入れてみました。

 

>もしコード内にkintone.plugin.app.setProxyConfigの記述が1箇所だけだったとしても、「データベースのロックに失敗したため、変更を保存できませんでした。時間をおいて再度お試しください。」というエラーが発生するということでしょうか?

→試してみましたが、発生しました。元々データベースエラーは常に発生するわけではありませんが、1箇所にした場合も発生しました。

 

>データベースエラーが表示されている状態でも、下記の2つとも設定が成功するということでしょうか?

→はい、成功している場合があります。成功していない場合もありますが・・・。

 

お手数をおかけしますがどうぞよろしくお願いします。

woodsnutsさん

お世話になっております。
ご回答ありがとうございます。

> 1箇所にした場合も発生しました
左様でしたか…。記述が1箇所だけれど、複数回実行される可能性がある記述ということはないですよね?

もとのご質問に戻りますが、エラーのキャッチは下記リンクの下の方ある、「コールバックを使った記述方法」または「kintone.Promise オブジェクトを使った記述方法」を利用して実装可能かと思います。
https://developer.cybozu.io/hc/ja/articles/203661160#list2

失敗した処理だけ、setIntervalを使ってリトライさせるのもよいかと思います。
https://developer.mozilla.org/ja/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

江田篤史 様
お世話になっております。お忙しい中、ご連絡いただき、ありがとうございました。

申し訳ありません、「コールバックを使った記述方法」または「kintone.Promise オブジェクトを使った記述方法」について教えていただけないでしょうか?

kintone.plugin.app.proxy、kintone.plugin.app.proxy.upload は、

返り値が、「引数の successCallback を省略した時、kintone.Promise オブジェクトを返します。」となっていますので、「コールバックを使った記述方法」または「kintone.Promise オブジェクトを使った記述方法」が使えると思うのですが、

kintone.plugin.app.setConfig、kintone.plugin.app.setProxyConfig は、

返り値なしとなっています。こちらも、failureCallbackやPromiseオブジェクトは利用できるでしょうか?

 

>記述が1箇所だけれど、複数回実行される可能性がある記述ということはないですよね?

kintone.plugin.app.setProxyConfig(url, ‘GET’, header, body);

のみの記述にして試しましたので、1回の実行だと思います。

どうぞよろしくお願いします。

woodsnutsさん

お世話になっております。

> kintone.plugin.app.setConfig、kintone.plugin.app.setProxyConfig は、返り値なしとなっています。
仰る通りですね。大変申し訳ございません。kintone.plugin.app.proxy.uploadについての情報を見ておりました。
kintone.plugin.app.setProxyConfigではfailureCallbackもないのでどう記述すれば良いでしょうかね…。
エラーメッセージがalertで出るとのことでしたが、ブラウザのコンソール画面上にはどのようにエラー表示されていますか?
https://developer.cybozu.io/hc/ja/articles/207613916

> kintone.plugin.app.setProxyConfig(url, ‘GET’, header, body); のみの記述にして試しましたので、1回の実行だと思います。
中身に kintone.plugin.app.setProxyConfig(url, ‘GET’, header, body); を記述している、親の関数が複数回実行されている可能性がないかという疑問でした。
直前の行にconsole.log()かalert()を挟むなどして、複数回実行されていないか試していただけますか?

console.log(1);
kintone.plugin.app.setProxyConfig(url, 'GET', header, body);

江田篤史 様
お世話になっております。早々にご連絡いただき、ありがとうございました。

ソースを以下のようにし、実行してみると、添付のようなコンソールになりました。

実行は一回で、エラーの際、コンソールにエラーが表示されます。(ただし、このコンソールログもプラグイン一覧画面へすぐに遷移してしまうため、一瞬で消えてしまいます。)

お手数をおかけしますがどうぞよろしくお願いします。

//APIトークンはProxyに保存する

    const url = kintone.api.url('/k/v1/records', true);

    const header = {

      ['X-Cybozu-API-Token']:settingForm.api_token.value

    };

    const body = {};

    console.log(1);

    // レコード取得

    kintone.plugin.app.setProxyConfig(url, 'GET', header, body);

    console.log(2);

    // レコード更新

    kintone.plugin.app.setProxyConfig(url, 'PUT', header, body);

    console.log(3);

    const json = JSON.stringify(data);

    kintone.plugin.app.setConfig({json: json});

    console.log(4);

江田篤史 様
お世話になっております。お忙しいところ、相談に乗っていただきありがとうございました。

先週まではデータベースエラーが頻繁に出ていたのですが、本日テストをしてみたところ、発生しなくなりました。

念のため、successCallbackのコーディングは残していますが、いったん、解決と思っております。

今後ともどうぞよろしくお願いします。