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

时间:2017-03-07 19:08:21

标签: javascript node.js express

这是初学者提出的问题,因为我在开始时有这个问题

如何为 express 设置端口而无需硬编码甚至自己选择端口?这是我在节点和快速启动时遇到的问题(I我仍然是一个初学者,有很多东西需要学习)。除了那些我想知道的事情,

  • 使用app.set('port', portNum)并直接使用app.listen(portNum)中的端口号之间的差异是什么?

4 个答案:

答案 0 :(得分:9)

如何设置快递端口而无需硬编码甚至自己选择端口?

选项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 - 特定于环境的配置文件(强烈推荐)

使用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

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

答案 1 :(得分:5)

我在问题中找到的答案

1。如何动态设置端口?

我发现您可以在 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)
})

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

根据我的经验/知识(老实说它几乎等于零)我开始相信,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)

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