一尘不染

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

node.js

这是初学者最常问的问题,因为我刚开始时就有这个问题

_如何在 不进行硬编码甚至自行选择端口的情况下设置用于 表达的
端口?_这是我从节点开始并表达时遇到的问题(我仍然是一个初学者,有很多东西要学习)。除了其他我想知道的事情,

  • 在中 使用app.set('port', portNum)和直接使用端口号有什么 区别app.listen(portNum)

阅读 423

收藏
2020-07-07

共1个答案

一尘不染

如何在不进行硬编码甚至自行选择端口的情况下设置用于表达的端口?


选项1:环境变量(推荐)

通常,您会将您的应用程序部署到Heroku等托管服务提供商。根据主机的配置方式,系统将动态设置环境变量,您的应用将需要从此变量获取端口。例如,托管提供程序在运行您的应用程序时可能会运行以下命令:

$ PORT=1234 npm start

…并且在代码中,您可以像下面这样访问此变量:

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

专家提示: 大多数托管服务提供商也允许您定义自定义环境变量。您可以通过创建以下任意变量在本地进行测试:

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

…并从如下代码访问这些变量:

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

选项2-特定于环境的配置文件(也强烈建议)

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

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

然后定义“默认”变量和特定于环境的变量:

default.json

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

testing.json

{
    "port": "5555"
}

production.json

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

配置库将始终使用 默认 变量。在 测试时 ,它将使用默认的管理员电子邮件和其他端口。在 生产时
,它将使用默认端口,但使用不同的管理员电子邮件。定义“节点环境”的方式是这样的(注意,我们使用与JSON配置文件相同的名称):

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

专家提示: 您的配置文件也可以引用环境变量!继续上面选项1中的示例,您可以这样定义生产配置:

production.json

{
    "port": "PORT"
}

配置库将查找名为“ PORT”的任何环境变量,并将使用该值。综上所述,运行应用程序的最终命令可能如下所示:

$ NODE_ENV=production PORT=47861 npm start

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


Express允许您使用app.set- 设置应用程序变量,但这只是定义变量的一种好方法。您稍后可以使用来获取这些变量的值app.get

迟早,您将需要告诉您的应用监听特定端口上的流量。您可以执行以下操作:

const app = express();
app.set('port', process.env.PORT);

app.use((req, res) => { ... });
app.listen(app.get('port'));
2020-07-07