如何dynamic设置快递服务器的端口?

这是初学者主要提出的问题,因为我刚开始时遇到了这个问题

如何设置端口快递,而无需硬编码,甚至自己select端口? 这就是我刚开始学习和expression的问题(我还是个初学者,有很多东西需要学习)。 除此之外,我想要知道的东西,

  • 使用app.set('port', portNum)和直接使用app.listen(portNum)端口号有app.listen(portNum)

1.dynamic设置端口


选项1:环境variables(推荐)

您经常会将您的应用程序部署到像Heroku这样的主机提供商。 根据主机的configuration方式,系统将dynamic设置一个环境variables,你的应用需要从这个variables中获取端口。 例如,托pipe提供程序可能会在运行您的应用程序时运行这样的命令:

 $ PORT=1234 npm start 

…在你的代码中,你可以像这样访问这个variables:

 const port = process.env.PORT; app.listen(port); 

专业提示:大多数托pipe服务提供商也可以定义自定义环境variables。 你可以通过创build如下的任意variables来在本地testing:

 $ FOO=bar ADMIN_EMAIL=joe@example.com npm start 

…并从这样的代码访问这些variables:

 const foo = process.env.FOO; //-> "bar" const adminEmail = process.env.ADMIN_EMAIL; //-> "joe@example.com" 

选项2 – 环境特定的configuration文件(强烈推荐)

使用像这样的configuration库可以让你有环境特定的configuration选项。 您的文件夹结构如下所示(请注意文件的名称):

 |- config |- default.json |- testing.json |- production.json |- src |- app.js 

然后定义一组“默认”variables:

default.json

 { "port": "3030", "adminEmail": "foo@example.com" } 

然后,对于每个环境,您可以覆盖单个属性。 例如,在testing中,您希望使用默认端口但使用不同的pipe理员电子邮件,而在生产中,您可能要使用端口80:

testing.json

 { "adminEmail": "tests@example.com" } 

production.json

 { "port": 80 } 

configuration库将始终使用默认的variables。 当你正在testing它将使用不同的pipe理邮件。 在生产时 ,它将使用默认的pipe理员电子邮件,但使用不同的端口。 你定义你的“节点环境”的方式是这样的(注意我们使用与我们的JSONconfiguration文件相同的名称):

 $ NODE_ENV=testing npm start $ NODE_ENV=production npm start 

专业提示:您的configuration文件也可以引用环境variables! 继续上面的选项1中的示例,您可以像这样定义您的生产configuration:

production.json

 { "port": "PORT" } 

configuration库将查找名为“PORT”的任何环境variables并将使用该值。 放在一起,运行你的应用程序的最终命令可能如下所示:

 $ NODE_ENV=production PORT=47861 npm start 

2.使用app.set('port', 1234) vs app.listen(1234)


这是一个奇怪的问题。 本地app.set中没有app.set这样的东西。 Express(和其他第三方库)允许您使用app.set设置全局应用程序variables – 但这只是一个方便的事情。 稍后可以使用app.get获取这些variables。 据我所知,调用app.set('port', 1234)没有比设置“正常”variables更特别: var port = 1234; – 它只是存储在不同的地方。

迟早,你将需要告诉你的应用程序来监听特定端口上的stream量。 使用NodeJS的http模块,你可以这样做:

 const http = require('http'); const server = http.createServer((req, res) => { ... }); server.listen(port); 

Express(和其他第三方库)使用内置的NodeJS库,并使用像app.listen这样的方法公开这个function:

 const express = require('express'); const app = express(); app.use((req, res) => { ... }); app.listen(port); // calls server.listen() for you 

我发现我的问题的答案

1.如何dynamic设置端口?

我发现你可以在app.listen()使用数字0来让express随机select端口,然后我很快发现我现在有一个问题,我不知道要访问哪个端口来知道我的服务器是否正在运行或不。 所以简单的答案就是在控制台中输出app.address().port ,所以一个简单的express服务器将如下所示

 let http = require('http'); let express = require('express'); let app = express(); app.use('/', serveStatic('./public')); app.get('/', (req, res) => {res.render('index')}); let server = http.createServer(app); server.listen(0, () => { console.log(server.address().port) }) 

2.使用app.set('port',1234)和直接使用app.listen(1234)中的端口号有什么区别?

在我的经验/知识(说实话,它几乎相当于零),我开始相信, app.set()设置app.locals中的属性,并允许稍后检索该信息(这有点类似于创build一个variables),但是我最近读了一下, app.set()允许存储的值在你的模板引擎和其他地方使用,这就使得它有了很大的不同。
在app.locals上设置一个属性和调用app.set()有什么区别?

只需一次运行(从unix shell提示符):

$ PORT = 1234节点app.js更永久:

$ export PORT = 1234 $ node app.js在Windows中:

设置PORT = 1234在Windows PowerShell中:

$ env:PORT = 1234

config.js

 let config = {}; // PORTS config.port = {}; config.port.alpha = 4050; // Server 1 config.port.beta = 4051; // Server 2 ..... module.exports = config; 

app.js

 const express = require("express"), config = require("./config"); .... app.set('port',config.port[process.env.SERVER_NAME]); app.listen(app.get('port'),function(){ console.log("Server running at "+app.get('port')); }); 

启动服务器

 SERVER_NAME=alpha node app.js SERVER_NAME=beta node app.js