Node.js请求模块无法POST到外部URL

时间:2017-07-10 07:19:28

标签: node.js google-app-engine http-post

我有一个从传感器收集数据的网络应用程序。传感器通过POST请求将数据发送到我的webapp example.com

出于调试目的,我需要在传感器和webapp之间创建一个额外的层。

我创建了一个额外的小网络应用程序,所有这一切都是将传入的POST请求转发到example.com并将其转发到webapp,现在响应不同的网址,比如example2.com

所以,在它之前:

sensors -> example.com (webapp)

现在是:

sensors -> example.com -> example2.com (webapp)

通过这种方式,我可以看到webapp对传感器的响应并记录下来。

为了完成这项工作,我使用了request module。当我在我的本地机器上测试它时,一切正常(我的额外层监听localhost:3000并且webapp监听localhost:3001),但是一旦我指向外部URL就得到了答案我返回是 404 Not Found ,即使我直接发布到example2.com,一切都按预期工作。

这是我的模块:

var express = require('express');
var app = express();
var request = require('request');
var bodyParser = require('body-parser');
var cuid = require('cuid');
var url = require('url');
app.use(bodyParser.text({ type: '*/*' }));

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

  // immediately send 200 OK to the client
  res.send('ok');

  // add a unique ID
  if (!req.headers['x-request-cuid']) {
    req.headers['x-request-cuid'] = cuid();
  }

  var log_string = req.headers['x-request-cuid'] + "," + new Date().toISOString();

  // filter empty requests
  var reqbody = req.body;
  if(typeof reqbody !== 'string'){
    return res.send('empty body');
  }
  // Configure the request
  var options = {
    method: 'POST',
    url: 'http://example.com', // <- if I put localhost:3001 (the port I put my webapp to listen on) here, it works
    headers: req.headers,
    body: reqbody
  };

  // Start the request
  request(options, function (error, response, body) {

    log_string += "," + new Date().toISOString() + "," + response.statusCode + "," + response.statusMessage + "," + response.body;
    console.log(log_string);
  });

});

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

如果有帮助,我正在使用Google App Engine,因此所有内容都会部署到Google App Engine。

编辑:澄清“不起作用”

1 个答案:

答案 0 :(得分:1)

根据this documentation,您的应用必须收听端口 8080

  

App Engine前端会将传入的请求路由到端口8080上的相应模块。您必须确保您的应用程序代码正在侦听8080.