当前位置: 首页 > 面试题库 >

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

濮君植
2023-03-14
问题内容

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

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

有没有办法使这项工作?


问题答案:

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

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]});
  }
  );
};

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



 类似资料:
  • 是否可以在不等待响应的情况下发送HTTP请求? 我在做一个物联网项目,需要记录传感器的数据。在每一个设置中,都有许多传感器,一个中央协调器(主要由Raspberry Pi实现)从传感器收集数据,并通过Internet将数据发送到服务器。 提前感谢! 编辑:传感器是无线的,但他们使用的技术在发送到协调器时很少(或没有)延迟。此协调器必须通过Internet发送数据。但是,假设互联网连接不好。因为这将

  • 我在做一个爬行项目。当我对网站进行简单的连接时,如下所示: URLConnection conn=new URL(URL).openConnection();BufferedReader reader=新的BufferedReader(新的InputStreamReader(conn.getInputStream())); 方法正确返回HTML正文。但是,网站对某些字段进行了内部请求。例如,网站从

  • 问题内容: 如何在node.js中使用数据发出出站HTTP POST请求? 问题答案: 这是一个使用node.js向Google Compiler API发出POST请求的示例: 我已经更新了代码,以显示如何从文件而不是硬编码的字符串发布数据。它使用async 命令来实现此目的,并在成功读取后发布实际代码。如果有错误,则抛出该错误,如果没有数据,则该过程以负值退出以指示失败。

  • 我目前正在开发一个新的REST Web服务,它是在Django REST Framework中开发的,在定义URL时,我对它的安全性表示怀疑。遵循为数据库中的列表数据定义GET方法的标准,我不明白这是否是一种安全的数据获取方法。 想象一下这种情况: 我访问一个URL /patients定义为返回患者列表。此列表不是公开的,只能由授权用户请求。由于并非所有用户都可以查看所有患者,因此我创建了一个哈希

  • Python 的标准库 urllib 提供了大部分 HTTP 功能,但使用起来较繁琐。通常,我们会使用另外一个优秀的第三方库:Requests,它的标语是:Requests: HTTP for Humans。 Requests 提供了很多功能特性,几乎涵盖了当今 Web 服务的需求,比如: 浏览器式的 SSL 验证 身份认证 Keep-Alive & 连接池 带持久 Cookie 的会话 流下载

  • 我尝试使用在集成测试套件中测试。 ()调用注入的(),后者使用调用另一个REST服务器。这导致运行测试时出现以下错误。 resourceAccessException:获取“http://test123.com/42/status”的请求时出现I/O错误:test123.com;嵌套异常为java.net.UnknownHostException:test123.com 我使用对本身进行集成测试,