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

新手上路,请多包涵

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

如何在不需要硬编码甚至自己选择端口的情况下为 express 设置端口? 这是我刚开始使用 node 和 express 时遇到的问题(我还是个初学者,还有很多东西要学)。我想知道的事情包括,

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

原文由 Syed Huzaifa Hassan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 458
2 个回答

如何在不需要硬编码甚至自己选择端口的情况下为 express 设置端口?


###选项一:环境变量(推荐)

通常,您会将应用程序部署到 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 和/或 dotenv 这样的配置库可以让你轻松管理特定于环境的配置选项。您的文件夹结构如下所示(注意文件名):

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

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

默认.json

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

测试.json

 {
    "port": "5555"
}

生产.json

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

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

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

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

生产.json

 {
    "port": "PORT"
}

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

 $ NODE_ENV=production PORT=47861 npm start

专业提示: - dotenv 可以与 配置 库一起使用,以实现最终的环境变量管理!!


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'));

原文由 Ryan Wheale 发布,翻译遵循 CC BY-SA 4.0 许可协议

我找到的问题答案

1.如何动态设置端口?

我发现你可以在 --- 0 app.listen() 让 express 随机选择端口,然后我很快发现我现在遇到了一个问题,我不知道要连接哪个端口访问以了解我的服务器是否正在运行。如此简单的答案就是在控制台中输出 app.address().port 一个简单的快速服务器看起来像这样

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.listen(1234)中使用app.set(‘port’, 1234)和直接使用端口号有什么区别?

根据我的经验/知识(老实说,它几乎等于零)我开始相信, app.set() 在 app.locals 中设置属性并允许稍后检索该信息(这有点类似于创建变量), 但我最近读到 app.set() 允许存储的值在你的模板引擎和其他地方使用,这使得它非常不同。

在 app.locals 上设置属性和调用 app.set() 有什么区别?

原文由 Syed Huzaifa Hassan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题