【问题标题】:In a Nodejs app how do I make an HTTP client request inside an Express method在 Nodejs 应用程序中,如何在 Express 方法中发出 HTTP 客户端请求
【发布时间】:2016-10-04 13:28:55
【问题描述】:

当浏览器或 curl 客户端调用我的 node express 应用程序时,我想从外部网站获取 JSON 数据并将其返回,但是尽管看到嵌套的 http 调用将 JSON 数据返回到我正在努力的 express 服务器让 JSON 返回到调用浏览器 - 我该怎么做?

这是当前带有 curl 响应的测试应用代码:

var http = require('http');
var app = require('express')();

app.get('/', function (req, res) {

  var str = '';

  var options = {
    host: 'jsonplaceholder.typicode.com',
    path: '/posts/1'
  };

  callback = function(response) {
    response.on('data', function (chunk) {
      str += chunk;
    });

    response.on('end', function () {
      console.log(str);
    });
  }

  var req = http.request(options, callback);

  res.send(str);
  req.end();
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

这是 CURL localhost:3000 的结果(没有返回正文数据):

服务器端控制台日志显示已收到 http 请求数据:

感谢所有建议/指针!

【问题讨论】:

  • 如果您只是想回复收到的任何内容,那么app.get('/', function (req, res) { res.status(200).send(req.body); }); 会将您在服务器端拥有的完整 json 发送回客户端。
  • 谢谢维克拉姆 - 我会试试的。在将响应返回给被调用者之前,我需要做什么来修改响应?
  • 嗨维克拉姆,对不起,我无法让这个工作,我怀疑这又是等待完成的问题,但幸运的是,与此同时已经收到了一些工作答案。无论如何谢谢!

标签: node.js http express


【解决方案1】:

作为替代方案(marcelino 提供的答案可以正常工作),您可以使用 Express 和 http.request() 提供的 streams 来缩短代码(并节省一点内存),如下所示:

app.get('/', function(req, res) {
  http.request('http://jsonplaceholder.typicode.com/posts/1', function(response) {
    response.pipe(res);
  }).on('error', function(e) {
    res.sendStatus(500);
  }).end();
});

【讨论】:

    【解决方案2】:

    您似乎需要等待嵌套响应返回,然后再发送实际响应,如下所示:

    app.get('/', function (req, res) {
    
      var str = '';
    
      var options = {
        host: 'jsonplaceholder.typicode.com',
        path: '/posts/1'
      };
    
      var callback = function(response) {
        response.on('data', function (chunk) {
          str += chunk;
        });
    
        response.on('end', function () {
          console.log(str);
          res.send(str); // SEND ACTUAL RESPONSE HERE
        });
      }
    
      var req = http.request(options, callback);
      req.end();
    
    });
    

    要不然你马上发str,它是空的,所以你看不到它。

    【讨论】:

    • req.end() 仍应位于处理函数的底部,否则将不会发出 HTTP 请求。
    • @robertklep 是的,诚实的错误,2 分钟前放回去了!
    • 感谢 Marcelino - 这很有意义!很快就会尝试。
    • 太棒了 :) 当我们这样做时:callback 也应该正确声明 (var callback),否则它会变成一个全局变量,可能会导致问题。
    • @robertklep 好提示! Joelster,如果您认为此答案解决了您的疑虑,请考虑将此答案标记为“正确”(通过单击问题左上角的复选标记)。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2017-07-10
    • 2013-02-25
    • 2013-05-26
    相关资源
    最近更新 更多