在Node.js中,process.env.PORT是什么?

245

process.env.PORT || 3000 在 Node.js 中有什么用途?我在某个地方看到过这个:

 app.set('port', process.env.PORT || 3000);

如果将端口号设为3000,那我可不可以使用这个端口号呢?

app.listen(3000);

如果不是的话,为什么?

7个回答

318

在许多环境中(例如Heroku),通常可以设置环境变量PORT来告诉您的Web服务器要侦听的端口。

因此,process.env.PORT || 3000的意思是:无论环境变量PORT中是什么,如果没有内容,则使用3000。

因此,将其传递给app.listenapp.set('port', ...),这使得您的服务器能够从环境接受“要侦听哪个端口”的参数。

如果您在app.listen()中硬编码3000,则始终会侦听端口3000,这可能仅适用于您或不适用于您的要求和运行服务器的环境要求。


很高兴在这里提到Heroku。我可以将其用于IP地址吗?因为我不想暴露标准的本地主机127.0.0.1,而是想从路由器的角度使用IP地址,以便我的其他电脑可以访问我的应用程序,例如“192.168.0.3”。 - Timo

101
  • 如果运行 node index.js,Node将使用3000

  • 如果运行 PORT=4444 node index.js,Node将使用process.env.PORT。在这个例子中,process.env.PORT等于4444。对于低于1024的端口,请使用sudo运行。


15
如果您在Windows机器上使用此命令,首先需要将端口变量设置为“set PORT=3300”,然后在下一个命令中,如果运行node server.js,它将使用端口3300而不是3000。 - Aakash Jain
1
对于Windows Powershell - https://dev59.com/7lgQ5IYBdhLWcg3wRR1j#43025189 - Harikrishnan
另外,在Linux中,您应该执行“PORT=4444; node index.js”。请注意分号。 - aemonge
不!在这种情况下,您需要以“export”关键字开始。 - Abdennour TOUMI
环境端口应该与备份端口相同吗? - xstax

54

当您将应用程序托管在其他服务(如Heroku、Nodejitsu和AWS)上时,您的主机可能会独立配置process.env.PORT变量;毕竟,您的脚本在他们的环境中运行。

Amazon的Elastic Beanstalk就是这样。如果您尝试设置一个静态端口值,例如3000,而不是process.env.PORT || 3000,其中3000是您的静态设置,则您的应用程序将导致500网关错误,因为Amazon正在为您配置端口。

这是一个最小的Express应用程序,可以部署在Amazon的Elastic Beanstalk上:

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

// use port 3000 unless there exists a preconfigured port
var port = process.env.PORT || 3000;

app.listen(port);

3
在支持 ES6 的 Node.js 中,您甚至可以编写更短的代码:const {PORT = 3000} = process.env - Julian
1
@PA。如果在生产环境中找到process.env.port,则port将获得其值。请记住,此操作将从左到右读取,并在任何可用值时停止。 - HoCo_
如果我们想要在不指定端口的情况下路由到特定的URL,我们该如何做呢? - Wolfy
我认为这个问题值得一篇独立的文章来讨论,也许已经有人问过或回答了,但我会为你尝试解答。这取决于你有多少权限来管理后端。它是否负载均衡?在代理后面?你是否使用重定向?例如,可以使用iptables将端口80或443重定向到端口3000。从用户的角度来看,他们连接到http或https的默认协议端口,而在内部,你将它们重定向到服务器托管的端口。这就是想法。这归结于配置。请考虑以下内容:https://serverfault.com/a/1019123 - ThisClark
我认为这个问题值得单独发帖,并且可能已经被提问/回答过了,但我会为你尝试一下。这取决于你对后端的管理权限有多大。它是否负载均衡?是否在代理后面?你是否使用重定向?例如,使用iptables可能可以将端口80或443重定向到端口3000。从用户的角度来看,他们连接的是http或https的默认协议端口,而在内部,你将他们重定向到托管服务器的端口。这就是想法。最终还是要看配置。请参考这个链接:https://serverfault.com/a/1019123 - undefined

13

在某些情况下,port 只能由环境指定,并保存在用户环境变量中。以下是 node.js 应用程序如何处理它。

process 对象是一个全局对象,提供有关当前 Node.js 进程的信息和控制。作为全局对象,它始终可在 Node.js 应用程序中使用,而无需使用 require()

process.env 属性返回一个包含用户环境的对象。

此对象的示例如下:

{
  TERM: 'xterm-256color',
  SHELL: '/usr/local/bin/bash',
  USER: 'maciej',
  PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
  PWD: '/Users/maciej',
  EDITOR: 'vim',
  SHLVL: '1',
  HOME: '/Users/maciej',
  LOGNAME: 'maciej',
  _: '/usr/local/bin/node'
}
例如, 终端:设置一个新的用户环境变量,但不会永久保存。
export MY_TEST_PORT=9999

app.js: 从node应用程序读取新的环境变量

console.log(process.env.MY_TEST_PORT)

终端:运行节点应用程序并获取值

$ node app.js
9999

4

Dotenv 是一个零依赖的模块,可以将 .env 文件 中的环境变量加载到 process.env. 中。将配置与代码分离存储在环境中,是基于“十二要素应用程序”方法论的。

使用 npm 安装

npm install dotenv

使用 Yarn 安装

yarn add dotenv

用法

在应用程序尽早的阶段,引入并配置 dotenv。

require('dotenv').config()

在文件资源管理器中首先创建一个 .env 文件,并在其中写入:

PORT: 8080

const http = require("http");

require("dotenv").config();

let port = process.env.PORT;
let host = process.env.HOST;

let server = http.createServer((req, res) => {
  console.log("Thanks for the request");
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.end("You Rock");
});

server.listen(port, host, () => {
  console.log(`Server is listening ${host}:${port}`);
});

1
Click to show 2 definitions.

(property) NodeJS.Process.env: NodeJS.ProcessEnv
The process.env property returns an object containing the user environment. See environ(7).

An example of this object looks like:

{
  TERM: 'xterm-256color',
  SHELL: '/usr/local/bin/bash',
  USER: 'maciej',
  PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
  PWD: '/Users/maciej',
  EDITOR: 'vim',
  SHLVL: '1',
  HOME: '/Users/maciej',
  LOGNAME: 'maciej',
  _: '/usr/local/bin/node'
}
It is possible to modify this object, but such modifications will not be reflected outside the Node.js process, or (unless explicitly requested) to other Worker threads. In other words, the following example would not work:

$ node -e 'process.env.foo = "bar"' && echo $foo
While the following will:

import { env } from 'process';

env.foo = 'bar';
console.log(env.foo);
Assigning a property on process.env will implicitly convert the value to a string. This behavior is deprecated. Future versions of Node.js may throw an error when the value is not a string, number, or boolean.

import { env } from 'process';

env.test = null;
console.log(env.test);
// => 'null'
env.test = undefined;
console.log(env.test);
// => 'undefined'
Use delete to delete a property from process.env.

import { env } from 'process';

env.TEST = 1;
delete env.TEST;
console.log(env.TEST);
// => undefined
On Windows operating systems, environment variables are case-insensitive.

import { env } from 'process';

env.TEST = 1;
console.log(env.test);
// => 1
Unless explicitly specified when creating a Worker instance, each Worker thread has its own copy of process.env, based on its parent thread’s process.env, or whatever was specified as the env option to the Worker constructor. Changes to process.env will not be visible across Worker threads, and only the main thread can make changes that are visible to the operating system or to native add-ons.

@since — v0.1.27

2
请使用以下链接编辑您的答案:https://stackoverflow.com/editing-help,如果有些文本不是代码的一部分。 - m4n0

0

process.env.PORT || 3000 的意思是: process.env.PORT 是你手动设置的 PORT 号码。 3000 是默认的 port。如果你没有手动设置,那么它将会监听 3000。

在你的代码中,app.set('port', process.env.PORT || 3000) 或者 app.listen(3000) 意思是一样的。它只是说它应该作为环境参数监听哪个端口。

3000 是你传递给 app.listen() 的硬编码参数,这意味着无论何时运行你的后端代码,你都将始终侦听 port 3000,这可能符合你的要求,也可能不符合,这取决于你的要求和服务器运行的环境要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接