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() 利用時のヒントにして頂ければ幸いです。