node.js http GET-为什么不使用&x27;当遇到错误时,它是否返回到调用函数?

node.js http GET-为什么不使用&x27;当遇到错误时,它是否返回到调用函数?,node.js,promise,Node.js,Promise,有人能告诉我,为什么当遇到“拒绝请求错误”时,这个函数不向我调用它的函数返回任何内容 我希望向调用此函数的函数返回一条错误消息,但当遇到指示的错误时,代码似乎停止执行 function httpRequest(options, postData) { console.log('DEBUG - httpRequest - begin'); return new Promise(function(resolve, reject) { console.log('DEBUG - httpRequ

有人能告诉我,为什么当遇到“拒绝请求错误”时,这个函数不向我调用它的函数返回任何内容

我希望向调用此函数的函数返回一条错误消息,但当遇到指示的错误时,代码似乎停止执行

function httpRequest(options, postData) {
console.log('DEBUG - httpRequest - begin');
return new Promise(function(resolve, reject) {
    console.log('DEBUG - httpRequest - a');
    var req = http.request(options, function(res) {
        console.log('DEBUG - httpRequest - b');
        // reject on bad status
        if (res.statusCode < 200 || res.statusCode >= 300) {
            console.log('DEBUG - httpRequest - error: bad status ' + res.statusCode);
            return reject(new Error('statusCode=' + res.statusCode));
        }
        // cumulate data
        var body = [];
        res.on('data', function(chunk) {
            body.push(chunk);
        });
        // resolve on end
        res.on('end', function() {
            console.log('DEBUG - httpRequest - res.on end');
            try {
                console.log('DEBUG - httpRequest - body = ' + body);
                body = JSON.parse(Buffer.concat(body).toString());
            } catch(e) {
                console.log('DEBUG - httpRequest -  reject(e)');
                reject(e);
            }
            resolve(body);
        });
    });
    // reject on request error
    req.on('error', function(err) {
        // This is not a "Second reject", just a different sort of failure
        console.log('DEBUG - httpRequest - req.on error (second) err = ' + err.response);
        reject(err); // *** <--- Why doesn't the error message here get returned to the calling function?
    });
    if (postData) {
        req.write(postData);
    } 
    req.end();
    console.log('DEBUG - httpRequest - req.end');
});
函数httpRequest(选项,postData){
log('DEBUG-httpRequest-begin');
返回新承诺(功能(解决、拒绝){
log('DEBUG-httpRequest-a');
var req=http.request(选项、函数(res){
log('DEBUG-httpRequest-b');
//拒绝不良状态
如果(res.statusCode<200 | | res.statusCode>=300){
log('DEBUG-httpRequest-error:bad status'+res.statusCode);
返回拒绝(新错误('statusCode='+res.statusCode));
}
//累积数据
变量体=[];
res.on('data',函数(块){
推(块);
});
//决意
res.on('end',function(){
log('DEBUG-httpRequest-res.on-end');
试一试{
log('DEBUG-httpRequest-body='+body);
body=JSON.parse(Buffer.concat(body.toString());
}捕获(e){
log('DEBUG-httpRequest-reject(e)');
拒绝(e);
}
决议(机构);
});
});
//请求时拒绝错误
请求开启('error',函数(err){
//这不是“第二次拒绝”,只是另一种失败
log('DEBUG-httpRequest-req.on error(second)err='+err.response);

拒绝(err);//***函数使用两个参数,
httpRequest
选项和
postData
,并返回一个承诺

在中,你说你这样称呼它:

 httpRequest(options, function (error, curConditions) { ... });
这是不正确的,原因有二:

  • 传递的第二个参数不是POST数据,而是(回调)函数
  • 您没有正确处理退回的承诺
正确的称呼方式是:

httpRequest(options).then(function(curConditions) {
  ... // handle the result
}).catch(function(err) {
  ... // handle the error
});

您是否正确地处理了返回的承诺?我这样称呼它:httpRequest(选项、函数(错误、curConditions){console.log('DEBUG-164-error='+error.response);});根据我的console.log语句,它似乎没有返回错误。谢谢Robert!这修复了它。我已经编写了很多年了,但我目前是一个n00b,考虑到node.js的异步性质,并且正在使用Promissions。一旦我能够这样做(我在这里的帐户太新),我会投票给你答案。