在HTTP请求中指定端口号(node.js)

12

使用request模块进行HTTP请求时,是否可以指定端口号?我在文档中没有看到相关内容:

var request = require('request');

// this works
request({
  method: 'GET',
  url: 'http://example.com'
}, function(error, response, body) {
  if (error) console.log(error);
  console.log(body);
});

// this does not work
request({
  method: 'GET',
  url: 'http://example.com:10080'
}, function(error, response, body) {
  // ...
});

另外,当我运行第二个版本时,我的程序中几乎什么都没发生(就像请求从未发出一样)。

我也知道在使用核心 http 模块进行请求时可以指定端口号。为什么请求模块中没有此选项?

编辑:我之前应该提到这一点,但我正在Heroku上运行此应用程序。

当我本地运行请求时(使用请求模块),我可以指定端口号并得到成功的回调。

当我从Heroku运行请求时,没有回调被触发,并且nginx没有记录请求。

我疯了吗? Heroku有阻止我向特定端口号发出出站HTTP请求的原因吗?


你尝试运行Wireshark确认没有发生任何事情了吗? - Jonathon Reinhart
没有,但我已经成功地使用其他客户端发出了HTTP请求。 - djfdev
回调函数甚至没有被执行?这似乎很奇怪。 - Jonathon Reinhart
是的,回调函数从未被执行。我已经更新了我的帖子并提供了更多信息。 - djfdev
2个回答

8

我知道这个问题是关于请求模块的,但在更一般的情况下,如果使用http模块,你可以使用端口键 port,请参见文档

例如:

http.get({
    host: 'example.com', 
    path: '/some/path/',
    port: 8080
}, function(resp){
    resp.on('data', function(d){
        console.log('data: ' + d)
    })
    resp.on('end', function(){
        console.log('** done **')
    })
}).on('error', function(err){
    console.log('error ' + err)
})

1
希望能够找到使用“request”而不是核心的“http”模块的解决方案。 - djfdev
这很有帮助,所以加一,但我希望我可以直接在URL中输入端口号。 - Shawn Eary

8

使用完整的URL作为第一个参数与request一起使用可以解决我的问题:

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

// start a test server on some non-standard port
var server = http.createServer(function (req, res) {
  res.end('Hello world');
});
server.listen(1234);

// make the GET request
request('http://127.0.0.1:1234', function (err, res) {
  if (err) return console.error(err.message);

  console.log(res.body);
  // Hello world

  server.close();
});

同时分别指定方法url也可以:

request({
  method: 'GET',
  url: 'http://127.0.0.1:1234'
}, function (err, res) {
  if (err) return console.error(err.message);

  console.log(res.body);
  // Hello world

  server.close();
});

您可能需要检查服务器是否正在运行,并且您不在代理或防火墙后面,这可能会阻止对该端口的访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接