处理请求时如何获取node.js中的端口号?

cis*_*iso 3 node.js

如果我有两个node.js服务器在运行,我怎么能告诉哪个服务器调用了processRequest函数?

var http = require('http');
var https = require('https');
function processRequest(req, res) {
    res.writeHead(200);
    res.end("hello world, I'm on port: " + ???.port + "\n");
}
var server1 = http.createServer(processRequest).listen(80);
var server2 = https.createServer(processRequest).listen(443);
Run Code Online (Sandbox Code Playgroud)

最初我想要端口号,但找不到对象/变量给我.根据以下答案,确定加密与非加密更有意义,因为要知道请求中的哪些http服务器.

dc5*_*dc5 10

req参数是IncomingMessage的一个实例,您可以从中访问套接字.

从那里,您可以访问localPort和remotePort.

就像是:

console.log(req.socket.localPort);
console.log(req.socket.remotePort);
Run Code Online (Sandbox Code Playgroud)


Dee*_*pta 8

如果您使用的是http://localhost:<port_number>,那么您可以使用属性获取端口号req.headers.host

例子:

const http = require('http');
const server = http.createServer((req, res)=>{
    console.log(req.headers.host); // localhost:8080
    console.log(req.headers.host.split(':')[1]); // 8080
})
server.listen(8080);
Run Code Online (Sandbox Code Playgroud)


msc*_*dex 5

您也可以检查服务器实例或连接对象,而不是检查端口号:

var http = require('http'),
    https = require('https');
function processRequest(req, res) {
  var isSSL = (req.socket.encrypted ? true : false);
  // alternate method:
  // var isSSL = (this instanceof https.Server);
  // or if you want to check against a specific server instance:
  // var isServer1 = (this === server1);

  res.writeHead(200);
  res.end('hello world, i am' + (!isSSL ? ' not' : '') + ' encrypted!\n');
}
var server1 = http.createServer(processRequest).listen(80);
var server2 = https.createServer(processRequest).listen(443);
Run Code Online (Sandbox Code Playgroud)

  • 但克里斯询问如何确定端口号,而不是正在运行的服务或正在使用的协议. (5认同)

joh*_*yan 5

这样你就可以得到端口号:

var http = require('http');
var server = http.createServer().listen(8080);

server.on('request', function(req, res){
    res.writeHead(200, {"Content-Type": "text/html; charset: UTF-8"});
    res.write("Hello from Node! ");
    res.write(" Server listening on port " + this.address().port);
    res.end();
});
Run Code Online (Sandbox Code Playgroud)