使用nodeJS进行异步http调用

Lud*_*udo 4 http node.js node-async

我想在我的服务器节点上启动异步http调用,我看到了async节点模块,我想async.parallel我们可以做到这一点.

记录的示例非常清楚,但我不知道如何管理多个http调用.

我尝试了下面的示例,但它甚至没有启动http调用:

var http = require('http');

var Calls = [];
Calls.push(function(callback) {
    // First call
    http.get('http://127.0.0.1:3002/first' callback);
});

Calls.push(function(callback) {
    // Second call
     http.get('http://127.0.0.1:3002/second' callback);
});

var async = require('async');
async.parallel(Calls, function(err, results) {
    console.log('async callback: '+JSON.stringify(results));
    res.render('view', results);
});
Run Code Online (Sandbox Code Playgroud)

如果我单独启动http请求,我确实有一个结果,但我调用异步回调 async callback: [null,null]

fre*_*ish 5

看看文档:

使用http.request()时,必须始终调用req.end()来表示您已完成请求 - 即使没有数据写入请求正文.

您正在创建请求,但您尚未最终确定.在您的通话中,您应该:

var req = http.request(options, function(page) {
    // some code
});
req.end();
Run Code Online (Sandbox Code Playgroud)

这假设您正在执行没有正文的正常GET请求.

您还应该考虑使用http.get这是一个很好的快捷方式:

http.get("http://127.0.0.1:3002/first", function(res) {
    // do something with result
});
Run Code Online (Sandbox Code Playgroud)

更新另一件事是异步中的回调必须是形式

function(err, res) { ... }
Run Code Online (Sandbox Code Playgroud)

你现在这样做的方法是行不通的,因为对http.get的回调只接受一个参数res.您需要做的是以下内容:

http.get('http://127.0.0.1:3002/second', function(res) {
    callback(null, res);
});
Run Code Online (Sandbox Code Playgroud)