_如何在 不进行硬编码甚至自行选择端口的情况下设置用于 表达的 端口?_这是我从节点开始并表达时遇到的问题(我仍然是一个初学者,有很多东西要学习)。除了其他我想知道的事情,
app.set('port', portNum)
app.listen(portNum)
通常,您会将您的应用程序部署到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"
专家提示: 大多数托管服务提供商也允许您定义自定义环境变量。您可以通过创建以下任意变量在本地进行测试:
$ FOO=bar ADMIN_EMAIL=joe@example.com npm start
…并从如下代码访问这些变量:
const foo = process.env.FOO; //-> "bar" const adminEmail = process.env.ADMIN_EMAIL; //-> "joe@example.com"
使用配置库中像这样一个可以让你有特定环境的配置选项。您的文件夹结构如下所示(注意文件名):
|- 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
专家提示: 您的配置文件也可以引用环境变量!继续上面选项1中的示例,您可以这样定义生产配置:
{ "port": "PORT" }
配置库将查找名为“ PORT”的任何环境变量,并将使用该值。综上所述,运行应用程序的最终命令可能如下所示:
$ NODE_ENV=production PORT=47861 npm start
Express允许您使用app.set- 设置应用程序变量,但这只是定义变量的一种好方法。您稍后可以使用来获取这些变量的值app.get。
app.set
app.get
迟早,您将需要告诉您的应用监听特定端口上的流量。您可以执行以下操作:
const app = express(); app.set('port', process.env.PORT); app.use((req, res) => { ... }); app.listen(app.get('port'));