我在Bluebird的promise库的帮助下,在Facebook的Graph API上使用了请求模块。通过传入错误的密钥来测试catch方法。
这里有两个问题: 1.当我使用promise时,为什么数组中的响应? 2.为什么根本没有调用clientError谓词?
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));
}
});
答案 0 :(得分:2)
- 当我使用promise时,为什么数组中的响应?
醇>
因为request
库通过使用多个参数解析回调而违反了回调协定。 Bluebird别无选择,只能将其包装在一个数组中。您可以轻松.get(0)
或.get(1)
访问特定媒体资源。
request.getAsync("...").get(0); // just the response
request.getAsync("...").spread(function(response, body){ // spread arguments
// ...
});
- 为什么根本没有调用clientError谓词?
醇>
由于承诺未处于异常状态,因此先前的承诺已解决并且then
回调已运行。