2016-11-17 108 views
0

我试图对API执行GET请求,并将API响应中的数据返回给客户端。我认为客户端在API完成GET请求之前收到响应。如何更改代码以确保API的响应传递给客户端?使用响应链接GET请求Node.js

if (request.method == 'POST' && request.url == '/locationdata') { 
    var body = ''; 
    request.on('data', function (data) { 
     body += data; 
    }); 

    request.on('end', function() { 
     var formattedLocation = body.replace(/[\[\]']+/g, ''); 
     var urlAPI = 'https://api.darksky.net/forecast/166731d8eab28d33a26c5a51023eff4c/' + formattedLocation; 

     response.writeHead(200, { 'Content-Type': 'application/json' }); 
     var apiData = ''; 

     var apirequest = function() { 
      https.get(urlAPI, function (response) { 
       response.on('data', function (data) { 
        apiData += data; 
       }); 
       response.on('end', function() { 
        console.log(apiData); 
        return apiData; 
       }); 
      }); 
     } 

     response.end(apirequest); 
    }); 

    return; 
} 

回答

1

在从api获取所有数据之前,您将结束对客户端的响应。移动response.end()调用到api响应结束时应该修复它:

if (request.method == 'POST' && request.url == '/locationdata') { 
    var body = ''; 
    request.on('data', function (data) { 
     body += data; 
    }); 

    request.on('end', function() { 
     var formattedLocation = body.replace(/[\[\]']+/g, ''); 
     var urlAPI = 'https://api.darksky.net/forecast/166731d8eab28d33a26c5a51023eff4c/' + formattedLocation; 

     response.writeHead(200, { 'Content-Type': 'application/json' }); 
     var apiData = ''; 

     https.get(urlAPI, function (apiResponse) { 
      apiResponse.on('data', function (data) { 
       apiData += data; 
      }); 
      apiResponse.on('end', function() { 
       console.log(apiData); 
       // send response to browser after we get all the data from the api 
       response.end(apiData); 
      }); 
     }); 

     // remove this because we moved it up 
     //response.end(apirequest); 
    }); 

    return; 
} 
+0

我仍然收到一个错误。我在节点中获取API数据,但我认为在响应结束之前它仍未被发送到浏览器。我在浏览器中出现以下错误:'“语法错误:JSON.parse ...”' –

+0

我调整了答案并在代码中包含了它的完整副本 – Ryan

+0

它的工作原理!谢谢。你的调整只是一个小错误。我必须改变'response.end(apirequest);''response.end(apiData);' –