如何为 express 设置端口而无需硬编码甚至自己选择端口?这是我在节点和快速启动时遇到的问题(I我仍然是一个初学者,有很多东西需要学习)。除了那些我想知道的事情,
app.set('port', portNum)
并直接使用app.listen(portNum)
中的端口号之间的差异是什么?答案 0 :(得分:9)
您经常会将应用部署到托管服务提供商,例如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"
使用this one之类的配置库可以让您拥有特定于环境的配置选项。您的文件夹结构如下所示(请注意文件的名称):
|- 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
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'));
答案 1 :(得分:5)
我发现您可以在 0
中使用数字app.listen()
让我们随机选择端口,然后我很快发现我现在遇到了一个问题我没有#39;知道要访问哪个端口以了解我的服务器是否正在运行。这么简单的答案是在控制台中输出app.address().port
所以Simple 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)
})
根据我的经验/知识(老实说它几乎等于零)我开始相信,app.set()
在app.locals中设置属性并允许稍后检索该信息(这有点类似于创建一个变量),但我最近读到app.set()
允许存储的值在模板引擎和其他地方使用,这使它完全不同。
What is the difference between setting a property on app.locals and calling app.set()?
答案 2 :(得分:1)
仅运行一次(来自unix shell提示符):
$ PORT = 1234节点app.js 更永久:
$ export PORT = 1234 $ node app.js 在Windows中:
设置PORT = 1234 在Windows PowerShell中:
$ env:PORT = 1234
答案 3 :(得分:0)
let config = {};
// PORTS
config.port = {};
config.port.alpha = 4050; // Server 1
config.port.beta = 4051; // Server 2
.....
module.exports = config;
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