2017-02-28 9 views
1

문제점이 있습니다. node.js로 작업 중이며 다른 API 응답에 의존하는 API 호출을하고 싶습니다. 나는 모른다. 내가 뭔가를하려고 노력하지만 난 이런 몇 가지 오류 가지고 : 명시 적으로nodejs의 다른 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); 
    }); 

} 

누군가가 나를 도울 수 :

이 내 코드?

답변

1

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) 행을 이동하는 것입니다.

0

이 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*);  

      }); 
     } 
    }) 
관련 문제