Javascript 蓝鸟承诺:捕捉错误
我在Bluebird的promise库的帮助下使用Facebook的Graph API上的请求模块。通过传入错误的密钥来测试catch方法 这里有两个问题: 1.当我使用promise时,为什么响应在数组中? 2.为什么根本没有调用clientError谓词Javascript 蓝鸟承诺:捕捉错误,javascript,facebook-graph-api,promise,bluebird,Javascript,Facebook Graph Api,Promise,Bluebird,我在Bluebird的promise库的帮助下使用Facebook的Graph API上的请求模块。通过传入错误的密钥来测试catch方法 这里有两个问题: 1.当我使用promise时,为什么响应在数组中? 2.为什么根本没有调用clientError谓词 var request = Promise.promisifyAll(require('request')); var queryObj = { client_id: config.client_id, redirect_u
var request = Promise.promisifyAll(require('request'));
var queryObj = {
client_id: config.client_id,
redirect_uri: config.redirect_uri,
client_secret: config.wrong_client_secret,
code: req.query.code
};
var reqObj = {
url: 'https://graph.facebook.com/v2.3/oauth/access_token',
qs: queryObj
};
request.getAsync(reqObj)
.then(function (contents) {
console.log('success ' + JSON.stringify(contents));
/*
Produces (simplified it for brevity)
[{"statusCode":400,"body":"{\"error\":{\"message\":\"Error validating client secret.\"}}"}]
*/
}).catch(clientError, function(e) {
console.log('error: ' + e);
});
function clientError(contents) { // this is not called at all
var statusCode = contents[0].statusCode;
console.log('checking for error...' + statusCode);
return statusCode >= 400 && statusCode < 500;
}
// without promise:
var request = require('request');
request(reqObj, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(JSON.stringify(response));
/* Response: (simplified it for brevity)
{"statusCode":400,"body":"{\"error\":{\"message\":\"Error validating client secret.\"}}"}
*/
} else {
console.log(JSON.stringify(response));
}
});
var request=Promise.promisifyAll(require('request');
变量queryObj={
client\u id:config.client\u id,
重定向\u uri:config.redirect\u uri,
client\u secret:config.error\u client\u secret,
代码:req.query.code
};
var reqObj={
网址:'https://graph.facebook.com/v2.3/oauth/access_token',
qs:queryObj
};
request.getAsync(reqObj)
.然后(功能(内容){
log('success'+JSON.stringify(contents));
/*
生成(为简洁起见,对其进行了简化)
[{“statusCode”:400,“body”:“{\”error\”:{\“message\”:\“验证客户端密码时出错。\”}}]
*/
}).catch(clientError,函数(e){
console.log('错误:'+e);
});
函数clientError(contents){//根本不调用此函数
var statusCode=contents[0]。statusCode;
log('检查错误…'+状态代码);
返回状态码>=400&&statusCode<500;
}
//没有承诺:
var请求=要求(“请求”);
请求(请求对象、功能(错误、响应、正文){
如果(!error&&response.statusCode==200){
log(JSON.stringify(response));
/*答复:(为简洁起见,将其简化)
{“statusCode”:400,“正文”:“{\”错误\“:{\”消息\“:\”验证客户端密码时出错。\“}}”
*/
}否则{
log(JSON.stringify(response));
}
});
请求
库使用多个参数解析回调,违反了回调约定。蓝知更鸟别无选择,只能将其包裹在阵列中。您可以轻松地.get(0)
或.get(1)
访问特定属性
request.getAsync("...").get(0); // just the response
request.getAsync("...").spread(function(response, body){ // spread arguments
// ...
});
回调