kintone.proxy()のエラー処理
外部サービスのAPIをコールできるkintone.proxy()には、外部APIへのアクセスエラーと、kintone.proxy()そのもののエラーがあります。この時エラーに関しては、これらを特段区別せずにまとめて処理したかったりします。
2つのエラーをまとめて処理するラッピング
世のAPIのリクエスト成功時のステータスコードはたいてい200ですので、結果ステータスコード200の時にはkintone.proxy()のリクエスト全体として成功(callback、resolve)、それ以外は(errback、reject)とするように考えると、次のようにラッピング出来そうです。
// kintone.proxy()のラッピングメソッド function kintoneProxy(url, method, headers, data, callback, errback) { if (callback === undefined && errback === undefined) { // (1)kintone.Promiseオブジェクトを返す return new kintone.Promise(function(resolve, reject) { kintone.proxy(url, method, headers, data, function(body, status, headers) { if (status !== 200) { reject(body); } else { resolve(body); } }, function(err) { reject(err); }); }); } else if (callback !== undefined && errback === undefined) { // (2)callbackを利用(errback省略):非推奨 kintone.proxy(url, method, headers, data, function(body, status, headers) { callback(body); if (status !== 200) { console.log('recommended you define errorback function.'); console.log(body); } }); } else { // (3)callbackを利用(errbackも定義) kintone.proxy(url, method, headers, data, function(body, status, headers) { if (status !== 200) { errback(body); } else { callback(body); } }, function(err) { errback(err); }); } }
(1)ではkintone.Promiseオブジェクトを返すスタイル、(2)、(3)ではcallbackを利用するスタイルを定義しましたが、errbackを省略できる(2)の形は利用せずにしっかりエラーを拾うようにした方が良いように思います。
ラッピングメソッドの利用方法
これを用いると、実行時次のような書き方になります。
// (1)kintone.Promiseオブジェクトを返す kintoneProxy('http://***.net', method, headers, params).then(function(resp){ console.log(JSON.parse(resp)); }).catch(function(err){ console.log(err); }); // (2)callbackを利用(errback省略):非推奨 kintoneProxy('http://***.net', method, headers, params, function(resp){ console.log(JSON.parse(resp)); }); // (3)callbackを利用(errbackも定義) kintoneProxy('http://***.net', method, headers, params, function(resp){ console.log(JSON.parse(resp)); }, function(err){ console.log(err); });
成功時のコールバックの引数が元々3つだったものが1つになるところと、それがテキストであるところが特徴的です。用途によってはJSON.parseをラッピングの一部にしてしまうのもありだと思いますが、kintone.proxy()はJSON形式のレスポンスに縛られている訳ではありませんので、今回はテキストのままとしました。kintone.proxy() や kintone.plugin.app.proxy() 利用時のヒントにして頂ければ幸いです。