【问题标题】:NodeJS: How to get the server's port?NodeJS:如何获取服务器的端口?
【发布时间】:2011-06-17 23:21:31
【问题描述】:

你经常会看到 Node 的示例 hello world 代码,它创建一个 Http 服务器,开始监听一个端口,然后是类似以下内容的代码:

console.log('Server is listening on port 8000');

但理想情况下你会想要这个:

console.log('Server is listening on port ' + server.port);

如何在调用 server.listen() 之前检索服务器当前正在侦听的端口而不将数字存储在变量中?

我以前见过这样做,但我在 Node 文档中找不到它。也许这是要表达的特定内容?

【问题讨论】:

  • req.headers.host中查找

标签: javascript node.js express port


【解决方案1】:

您可能正在寻找process.env.PORT。这允许您使用所谓的“环境变量”动态设置侦听端口。 Node.js 代码如下所示:

const port = process.env.PORT || 3000; 
app.listen(port, () => {console.log(`Listening on port ${port}...`)}); 

您甚至可以使用export PORT=5000 或您想要的任何端口在终端中手动设置动态变量。

【讨论】:

    【解决方案2】:

    如果您没有定义端口号并且您想知道它在哪个端口上运行。

    let http = require('http');
    let _http = http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello..!')
    }).listen();
    console.log(_http.address().port);
    

    仅供参考,每次它都会在不同的端口运行。

    【讨论】:

      【解决方案3】:
      const express = require('express');                                                                                                                           
      const morgan = require('morgan')
      const PORT = 3000;
      
      morgan.token('port', (req) => { 
          return req.app.locals.port; 
      });
      
      const app = express();
      app.locals.port = PORT;
      app.use(morgan(':method :url :port'))
      app.get('/app', function(req, res) {
          res.send("Hello world from server");
      });
      
      app1.listen(PORT);
      

      【讨论】:

        【解决方案4】:
        var express = require('express');    
        var app = express();
            app.set('port', Config.port || 8881);
            var server = app.listen(app.get('port'), function() {
                console.log('Express server listening on port ' + server.address().port); 
            });
        

        Express 服务器监听 8881 端口

        【讨论】:

          【解决方案5】:

          您可以使用server.address().port获取端口号 就像下面的代码:

          var http = require('http');
          var serverFunction = function (req, res) {
          
              if (req.url == '/') {
                  console.log('get method');
                  res.writeHead(200, { 'content-type': 'text/plain' });
                  res.end('Hello World');
              }
          
          }
          var server = http.createServer(serverFunction);
          server.listen(3002, function () {
              console.log('server is listening on port:', server.address().port);
          });
          

          【讨论】:

            【解决方案6】:

            更简单的方法是调用app.get('url'),它会为您提供协议、子域、域和端口。

            【讨论】:

              【解决方案7】:
              req.headers.host.split(':')[1]
              

              【讨论】:

                【解决方案8】:

                Express 4.x 答案:

                Express 4.x(根据以下 Tien Do 的回答),现在将 app.listen() 视为异步操作,因此 listener.address() 只会在 app.listen() 的回调中返回数据:

                var app = require('express')();
                
                var listener = app.listen(8888, function(){
                    console.log('Listening on port ' + listener.address().port); //Listening on port 8888
                });
                

                表达3答案:

                我想你正在寻找这个(表达具体?):

                console.log("Express server listening on port %d", app.address().port)
                

                当您从express 命令创建目录结构时,您可能已经看到了这个(底线):

                alfred@alfred-laptop:~/node$ express test4
                   create : test4
                   create : test4/app.js
                   create : test4/public/images
                   create : test4/public/javascripts
                   create : test4/logs
                   create : test4/pids
                   create : test4/public/stylesheets
                   create : test4/public/stylesheets/style.less
                   create : test4/views/partials
                   create : test4/views/layout.jade
                   create : test4/views/index.jade
                   create : test4/test
                   create : test4/test/app.test.js
                alfred@alfred-laptop:~/node$ cat test4/app.js 
                
                /**
                 * Module dependencies.
                 */
                
                var express = require('express');
                
                var app = module.exports = express.createServer();
                
                // Configuration
                
                app.configure(function(){
                  app.set('views', __dirname + '/views');
                  app.use(express.bodyDecoder());
                  app.use(express.methodOverride());
                  app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
                  app.use(app.router);
                  app.use(express.staticProvider(__dirname + '/public'));
                });
                
                app.configure('development', function(){
                  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
                });
                
                app.configure('production', function(){
                  app.use(express.errorHandler()); 
                });
                
                // Routes
                
                app.get('/', function(req, res){
                  res.render('index.jade', {
                    locals: {
                        title: 'Express'
                    }
                  });
                });
                
                // Only listen on $ node app.js
                
                if (!module.parent) {
                  app.listen(3000);
                  console.log("Express server listening on port %d", app.address().port)
                }
                

                【讨论】:

                • 谢谢,我想这正是我想要的。一旦有机会测试它,我会接受它。干杯。
                • 如果你不想拥有那个变量var listener,你可以在app.listen()回调中使用this.address().port
                • 这在 Express 5.x 中是什么样子的?
                • 你也可以在中间件的任何地方获取端口:req.socket.address().port
                • 只是为了补充@AndreiStalbe 所说的内容,您可以使用this.address.port(),但不能在箭头函数中使用它。你需要做老派app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(是的,我知道反引号更好,但我不能在堆栈溢出 cmets 中这样做)
                【解决方案9】:

                从来没有必要要求 http 模块。

                在 Express 3 或 4 中不需要额外导入 http。分配 listen() 的结果就足够了。

                var server = require('express')();
                
                server.get('/', function(req, res) {
                  res.send("Hello Foo!");
                });
                
                var listener = server.listen(3000);
                console.log('Your friendly Express server, listening on port %s', listener.address().port);
                // Your friendly Express server, listening on port 3000
                

                同样,这是在 Express 3.5.1 和 4.0.0 中测试的。从来没有必要导入http。 listen 方法返回一个 http 服务器对象。 https://github.com/visionmedia/express/blob/master/lib/application.js#L531

                【讨论】:

                  【解决方案10】:

                  我用这种方式 Express 4:

                  app.listen(1337, function(){
                    console.log('Express listening on port', this.address().port);
                  });
                  

                  通过使用它,我不需要为侦听器/服务器使用单独的变量。

                  【讨论】:

                  • 迄今为止最好的答案!如果您使用的是 ES6,请不要使用箭头函数。 this 将未定义。
                  • 这在 async 函数内部有效,而 listener.address().port 方法无效。
                  【解决方案11】:

                  我也在问自己这个问题,然后我来Express 4.x guide page 看这个样本:

                  var server = app.listen(3000, function() {
                     console.log('Listening on port %d', server.address().port);
                  });
                  

                  【讨论】:

                  • 但我不知道为什么 server.address().address 在我的本地开发机器 (OSX) 上总是 0.0.0.0。
                  • 这应该添加到接受的答案中,因为 Express 4.0 不再将 app.listen() 视为同步操作,您现在需要在回调中运行 listener.address()。
                  【解决方案12】:

                  从旧样式转换为新(Express 3.x)样式的最简单方法是这样的:

                  var server = app.listen(8080);
                  console.log('Listening on port: ' + server.address().port);
                  

                  Pre 3.x 的工作方式如下:

                  /* This no longer works */
                  app.listen(8080);
                  console.log('Listening on port: ' + app.address().port);
                  

                  【讨论】:

                    【解决方案13】:

                    如果你在请求处理时需要一个端口并且应用程序不可用,你可以使用这个:

                    request.socket.localPort
                    

                    【讨论】:

                      【解决方案14】:

                      findandbind npm 为 express/restify/connect 解决了这个问题:https://github.com/gyllstromk/node-find-and-bind

                      【讨论】:

                        【解决方案15】:

                        如果你使用的是 express,你可以从请求对象中获取:

                        req.app.settings.port // => 8080 or whatever your app is listening at.
                        

                        【讨论】:

                          【解决方案16】:

                          在 express v3.0 中,

                          /* No longer valid */
                          var app = express.createServer();
                          app.listen();
                          console.log('Server running on %s', app.address().port);
                          

                          不再有效!对于 Express v3.0,您应该以这种方式创建应用程序和服务器:

                          var express = require('express');
                          var http = require('http');
                          
                          var app = express();
                          var server = http.createServer(app);
                          
                          app.get('/', function(req, res) {
                              res.send("Hello World!");
                          });
                          
                          server.listen(3000);
                          console.log('Express server started on port %s', server.address().port);
                          

                          我自己遇到了这个问题,想记录下新的语法。 Express v3.0 中的这一变化和其他变化可见于https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

                          【讨论】:

                          • 或者你可以使用旧的方法来创建服务器,它仍然有效。似乎不再有办法访问端口后记。但是,由于您在调用 server.listen 时自己指定端口,因此实际上不需要使用 server.address().port,因为您可以使用传递给 server.listen 的相同值。
                          • (虽然我刚刚看了迁移指南,发现你上面提到的创建应用和服务器的方法实际上是新的首选方法。)
                          • @MaryHamlin:如果您将0 传递给server.listen(),这很有用,在这种情况下会分配一个随机端口号。如果您在一台服务器上运行多个 Express 应用程序并且不想手动分配端口号,则可以这样做。
                          • app.listen() 还返回 http 服务器实例。
                          【解决方案17】:

                          在当前版本(v0.5.0-pre)中,端口似乎可以作为服务器对象的属性使用,请参阅http://nodejs.org/docs/v0.4.7/api/net.html#server.address

                          var server = http.createServer(function(req, res) {
                              ...
                          }
                          
                          server.listen(8088);
                          console.log(server.address());
                          console.log(server.address().address);
                          console.log(server.address().port);
                          

                          输出

                          { address: '0.0.0.0', port: 8088 }
                          0.0.0.0
                          8088
                          

                          【讨论】:

                            【解决方案18】:

                            使用最新的node.js(v0.3.8-pre):我检查了文档,检查了http.createServer()返回的服务器实例,并阅读了server.listen()的源代码......

                            遗憾的是,端口仅作为局部变量临时存储,并最终作为对本机方法 process.binding('net').bind() 调用的参数。我没有再看下去。

                            似乎没有比保留对您提供给 server.listen() 的端口值的引用更好的方法了。

                            【讨论】:

                            • +1 感谢您的研究。我接受 Alfred 的回答,因为他找到了我正在寻找的确切内容,但我很高兴我知道它现在不在 Node 核心中。
                            猜你喜欢
                            • 1970-01-01
                            • 2021-05-09
                            • 2012-10-31
                            • 2018-09-01
                            • 2019-12-08
                            • 2012-08-13
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多