Javascript 蓝鸟承诺:捕捉错误

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

我在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));
        }
    });
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));
}
});
  • 当我使用promise时,为什么响应在数组中 因为
    请求
    库使用多个参数解析回调,违反了回调约定。蓝知更鸟别无选择,只能将其包裹在阵列中。您可以轻松地
    .get(0)
    .get(1)
    访问特定属性

    request.getAsync("...").get(0); // just the response
    request.getAsync("...").spread(function(response, body){ // spread arguments
          // ...
    });
    
  • 为什么根本没有调用clientError谓词
  • 由于承诺未处于异常状态,因此前一个承诺已解析,然后运行
    回调