一尘不染

Node.JS等待发出HTTP请求的REST服务的回调

node.js

我正在使用express模块​​在Node.JS中创建Restful
API。在我的服务中,我向外部Endpoints(服务器端)提出了其他http请求,并且我需要将这些HTTP请求中的数据返回给我的Web服务请求正文。

我已经确认,如果我console.log对Web服务正在执行的所有操作进行操作,那么我将获得所需的数据。但是,当我尝试将这些值返回给服务时,它们返回Null。我知道这是由于异步导致的,并且回调未等待http请求完成。

有没有办法使这项工作?


阅读 338

收藏
2020-07-07

共1个答案

一尘不染

一种常见的做法是使用异步模块。

npm install async

async模块具有处理各种形式的异步事件的原语。

对于您的情况,该async#parallel调用将允许您同时向所有外部API发出请求,然后合并结果以返回给您的请求者。

由于您正在发出外部http请求,因此您可能会发现请求模块也很有帮助。

npm install request

使用requestasync#parallel路由处理程序看起来像这样…

var request = require('request');
var async = require('async');

exports.handler = function(req, res) {
  async.parallel([
    /*
     * First external endpoint
     */
    function(callback) {
      var url = "http://external1.com/api/some_endpoint";
      request(url, function(err, response, body) {
        // JSON body
        if(err) { console.log(err); callback(true); return; }
        obj = JSON.parse(body);
        callback(false, obj);
      });
    },
    /*
     * Second external endpoint
     */
    function(callback) {
      var url = "http://external2.com/api/some_endpoint";
      request(url, function(err, response, body) {
        // JSON body
        if(err) { console.log(err); callback(true); return; }
        obj = JSON.parse(body);
        callback(false, obj);
      });
    },
  ],
  /*
   * Collate results
   */
  function(err, results) {
    if(err) { console.log(err); res.send(500,"Server Error"); return; }
    res.send({api1:results[0], api2:results[1]});
  }
  );
};

您还可以在此处了解其他回调排序方法。

2020-07-07