在Nodejs应用程序中,如何在Express方法

时间:2016-06-04 15:36:59

标签: node.js http express

当浏览器或curl客户端调用我的node express应用程序时,我想从外部网站获取JSON数据并返回它,但是尽管看到嵌套的http调用将JSON数据返回给我的快速服务器,我正在努力获取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的结果(没有返回正文数据): enter image description here

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

所有建议/指示赞赏!

2 个答案:

答案 0 :(得分:6)

作为替代方案(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();
});

答案 1 :(得分:4)

在发出实际响应之前,您需要等待嵌套响应返回,如下所示:

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并且它已空,这就是为什么您无法看到它。