如果在GET请求回调中调用,则节点js POST请求不起作用

时间:2017-07-24 22:45:34

标签: node.js node-request

我获取请求从一个API获取JSON数据,并在get请求的回调内部进行另一个POST调用,将此数据POST到另一个API。这似乎不适合我。

var request = require('request');

function startFetchingHistory(postToApp){
request.get(url, function(err, res, body) {
   postToApp(body);
});
}



function postToApp(body) {

 var options = {
uri: 'http://localhost:3079/history',
method: 'POST',
json : body
};

request(options, function(error, response, body) {
console.log(error+response+body);
if (!error && response.statusCode == 200) {
  console.log(body);
} else {
  logger.error('Error from server is' + error);
    }
  });
}

以上不起作用。通过“不工作”,我的意思是永远不会调用POST请求回调。但是,如果我直接调用postToApp()方法,POST请求会成功。

2 个答案:

答案 0 :(得分:0)

可能是因为postToApp()需要变量' request'目前正由异步函数使用它(request.get)。

尝试制作另一个var innerRequest = require(' request');并将其用于postToApp()。

旁注:我认为通过将body返回到startFetchingHistory()范围内的变量并将其用作postToApp()

的arg,可能有更好的方法来实现它。

答案 1 :(得分:0)

两个重要概念

  1. request本质上是异步的
  2. 当您从主处理程序
  3. 返回时,将调用所调用的API

    如果您查看功能postToApp,请致电

      

    请求(选项,功能(错误,响应,正文){

    这将转到你的eventloop,函数执行并完成,而不必等待post调用完成。

    现在,您要做的是等待函数postToApp完成。最简单的IMO,如果要在postToApp

    的回调中回复您的API,这是正确的方法
    var request = require('request');
    
    function startFetchingHistory(postToApp) {
      request.get(url, function (err, res, body) {
        postToApp(body, (postResponse) => {
          //respond back with the result/error to your API
        });
      });
    }
    
    
    
    function postToApp(body, callback) {
      var options = {
        uri: 'http://localhost:3079/history',
        method: 'POST',
        json: body
      };
      request(options, function (error, response, body) {
        console.log(error + response + body);
        if (!error && response.statusCode == 200) {
          console.log(body);
          callback(body) // call the function back with the data you want to process;
        } else {
          logger.error('Error from server is' + error);
          callback(error) // call the function back with error to process;
        }
      });
    }