如何在nodejs中将api请求转换为另一个api请求

我有一个问题。 我正在与node.js工作,我想做一个API调用,这取决于另一个API响应。 我不知道。 我试图做一些事情,但我有这样的错误:

Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (C:\workstation\node_modules\express\lib\respons e.js:719:10) at ServerResponse.send (C:\workstation\node_modules\express\lib\response. js:164:12) at ServerResponse.json (C:\workstation\node_modules\express\lib\response. js:250:15) at IncomingMessage.<anonymous> (C:\workstation\server\controllers\apicontroller.js:81:25) at emitNone (events.js:91:20) at IncomingMessage.emit (events.js:185:7) at endReadableNT (_stream_readable.js:974:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickCallback (internal/process/next_tick.js:98:9) 

明确地说,这就是我想要做的:1-调用api来检索包含经度和纬度坐标的响应2-然后通过将它们与google api进行地理编码来将它们翻译为可读的地址。 3 – 最后在前端显示可读的地址。

这是我的代码:

 var https = require('https'); var Client = require('node-rest-client').Client; var client = new Client(); module.exports.getaddresses = function(request,response){ var optionsget = { host : 'externalhost', port : 443, path : '/rest/of/the/api', method: 'GET', auth: 'login:pwd' }; var reqGet = https.request(optionsget, function(res){ var myData = ''; res.on('data', function(d){ myData += d; }); res.on('end', function(){ var str = JSON.parse(myData); var locations = []; var lat, lon, address; for (var i=0;i<=str.reports.length-1;i++){ lat = str.reports[i].latitude; lon = str.reports[i].longitude; var args = { data: { lat: lat,lon: lon}, headers: { "Content-Type": "application/json" } }; client.post("http://localhost:3100/api/geocode", args, function (data, myresponse) { locations.push({ long:str.reports[i].longitude, latitude:str.reports[i].latitude, timestamp:str.reports[i].locationts, address:address }) }); response.json(locations); }}) }); reqGet.end(); reqGet.on('error', function(e){ console.error("error:",e); }); } 

有人能帮我吗?

你看到这个错误是因为你在for循环中发回了响应,这意味着它被多次执行。 每个请求处理程序只能返回一次响应。

你可以通过聚合位置来解决这个问题,最后回复一次。

 var https = require('https'); var Client = require('node-rest-client').Client; var client = new Client(); module.exports.getaddresses = function (request, response) { var optionsget = { host: 'externalhost', port: 443, path: '/rest/of/the/api', method: 'GET', auth: 'login:pwd' }; var reqGet = https.request(optionsget, function (res) { var myData = ''; res.on('data', function (d) { myData += d; }); res.on('end', function () { var str = JSON.parse(myData); var locations = []; var lat, lon, address; for (var i = 0; i <= str.reports.length - 1; i++) { lat = str.reports[i].latitude; lon = str.reports[i].longitude; var args = { data: { lat: lat, lon: lon }, headers: { "Content-Type": "application/json" } }; client.post("http://localhost:3100/api/geocode", args, function (data, myresponse) { locations.push({ long: str.reports[i].longitude, latitude: str.reports[i].latitude, timestamp: str.reports[i].locationts, address: address }) }); } }) }); reqGet.end(); reqGet.on('error', function (e) { console.error("error:", e); }); response.json(locations); } 

请注意,唯一的变化是在for循环之外移动response.json(locations)行。

我注意到在这个URL中,你也在调用项目中的端点。 为什么不直接调用该函数?

  client.post("http://localhost:3100/api/geocode", args, function (data, myresponse) { locations.push({ long:str.reports[i].longitude, latitude:str.reports[i].latitude, timestamp:str.reports[i].locationts, address:address }) 

相反,做这样的事情,

 res.on('end', function () { var str = JSON.parse(myData); var locations = []; var lat, lon, address; for (var i = 0; i <= str.reports.length - 1; i++) { lat = str.reports[i].latitude; lon = str.reports[i].longitude; var args = { data: { lat: lat, lon: lon }, headers: { "Content-Type": "application/json" } }; somePostGeoCodeFunction(*Your params to pass*); }); } })