我试图在单个URL调用中调用多个URL并在数组中推送它的json响应并发送该数组以响应最终用户.
我的代码看起来像这样:
var express = require('express'); var main_router = express.Router(); var http = require('http'); urls = [ "http://localhost:3010/alm/build_tool", "http://localhost:3010/alm/development_tool", "http://localhost:3010/alm/project_architecture"]; var responses = []; main_router.route('/') .get(function (req, res) { var completed_requests = 0; for (url in urls) { http.get(url, function(res) { responses.push(res.body); completed_request++; if (completed_request == urls.length) { // All download done, process responses array } }); } res.send(responses); });
我也尝试使用npm请求模块.当我运行此代码时,它只返回NULL或一些只有标题的随机输出.
我的目标是在单个节点获取请求中调用多个URL,并将其JSON输出附加到阵列上并发送给最终用户.
谢谢
在这里,试试这个代码,
const async = require('async'); const request = require('request'); function httpGet(url, callback) { const options = { url : url, json : true }; request(options, function(err, res, body) { callback(err, body); } ); } const urls= [ "http://localhost:3010/alm/build_tool", "http://localhost:3010/alm/development_tool", "http://localhost:3010/alm/project_architecture" ]; async.map(urls, httpGet, function (err, res){ if (err) return console.log(err); console.log(res); });
说明:
此代码使用async和请求节点包.async.map
通过定义需要3个PARAMS,第一个是一个阵列,第二个是要与该阵列的每个元素,以调用迭代函数,回调函数,当async.map完成处理调用.
map(arr, iterator, [callback])
通过迭代器函数映射arr中的每个值,生成一个新的值数组.使用arr中的项目和完成处理的回调调用迭代器.这些回调中的每一个都有两个参数:一个错误,以及来自arr的转换项.如果迭代器将错误传递给其回调,则会立即调用主回调(对于map函数)并显示错误.
注意:对迭代器函数的所有调用都是并行的.
在httpGet函数中,您request
使用传递的url 调用函数,并明确告知响应格式json
.request
,当完成处理时,调用三个参数的回调函数,错误 - 如果有的话,服务器响应,身体 - 响应体.如果没有err
from request
,async.map
则将这些回调的结果作为数组收集,并将该数组的末尾传递给其第三个回调函数.否则,如果(err)为true,则该async.map
函数停止执行并使用a调用其回调err
.