处理来自node.js应用程序的多个https请求

时间:2017-09-06 20:14:33

标签: javascript node.js request

我已经在SO上寻求帮助了解这个问题,我已经在圈子里走了一段时间但是我被卡住了

我正在使用node.js https创建多个ReST POSTS,我需要能够跟踪每个请求的响应,然后汇总结果。我每次执行的请求数量各不相同。

我创建了一个为每个http请求返回Promise的函数。

function httpRequest(params, postData) {
    return new Promise(function(resolve, reject) {
        var reqActivity = http.request(options, function(res) {                             

            if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode + ' statusMessage=' + res.statusMessage));
            }

            var chunks = [];
            res.on("data", function(chunk) {
                console.log("Blowing chunks...");
                chunks.push(chunk);
            });
            res.on("end", function() {
                console.log('At the end');
                var body = Buffer.concat(chunks);
                var response = JSON.parse(body);                     
                var errorMessage;
                if (//checking for some specific messages in the response) {
                    errorMessage = "stuff that went wrong";
                    reject(errorMessage);
                }
                resolve(body);                                
            });

            res.on("error", function(error) {
                console.log("in error");                                    
                reject(error);
            });     

            reqActivity.write(postData);                                    
            reqActivity.end();
         });                        
    });
};

然后我需要多次调用此函数并处理返回的promise,但如果我这样做,我看不出如何处理多次返回

httpRequest(options, JSON.stringify(bulkUpdateObj)).then(function(output) {
    console.log(output);
    // Do stuff
});

这让我觉得我需要建立一系列的承诺。这看起来像这样吗?

var promises = [];
promises.push(httpRequest(options, JSON.stringify(bulkUpdateObj)));

如果是这样,我如何使用Promise.all检查事情?或者这确实是正确的方法吗?

任何帮助,非常感谢,一如既往!

更新 所以我用Promise.all实现了Promise数组,如下所示:

Promise
.all(promises)
.then(values => {
    console.log("Inside of Promise.all - promise length: " + promises.length);
    console.log("Values: " + values);
})
.catch(reason => {
    console.log("Inside of error of Promise.all - promise length: " + promises.length);
    console.log("Reason: " + reason);
});

但我不断收到消息: (node:61289)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:14):

对我来说,看起来我正在处理拒绝,可能是什么导致这种情况?

1 个答案:

答案 0 :(得分:1)

这一切看起来都很接近。 Promise.all()应该能够处理剩下的事情。

一旦将一系列承诺推送到promises,您就可以:

Promise.all(promises)
.then(result => {
   //result will be an array of values returned from your requests
}
.catch(err => {
    // whoops.
}

唯一的问题是,如果你的一个请求拒绝,它会立即停止一切并拒绝整个事情。也许那就是你想要的,但如果没有,你可能更愿意解决某种错误,然后最终会出现在结果数组中