222

process.env.PORT || 3000Node.js中的用途是什么?我在某处看到了这个:

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

如果用来设置3000为监听端口,我可以用这个代替吗?

app.listen(3000);

如果不是为什么?

4

7 回答 7

290

在许多环境中(例如 Heroku),按照惯例,您可以设置环境变量PORT来告诉您的 Web 服务器监听哪个端口。

所以process.env.PORT || 3000意味着:环境变量 PORT 中的任何内容,如果没有,则为 3000。

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

如果您将3000硬编码传递给app.listen(),则您始终在侦听端口 3000,这可能只适合您,也可能不适合您,具体取决于您的要求和运行服务器的环境的要求。

于 2013-09-18T05:45:18.097 回答
93
  • 如果你运行node index.js,节点将使用3000

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

于 2016-08-22T10:23:20.537 回答
48

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

亚马逊的 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);
于 2016-05-02T02:14:04.360 回答
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:从节点应用程序读取新的环境变量

console.log(process.env.MY_TEST_PORT)

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

$ node app.js
9999
于 2018-06-25T23:52:51.727 回答
1

Dotenv是一个零依赖模块,它从 . env 文件process.env 中。将配置与代码分开存储在环境中是基于十二要素应用程序方法。

与 npm

npm 安装 dotenv

或与纱线

纱线添加 dotenv

用法

尽早在您的应用程序中要求并配置 dotenv。

需要('dotenv').config()

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

端口: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}`);
});
于 2021-07-27T15:44:27.273 回答
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,这可能适合您,也可能不适合您,具体取决于您的要求和环境要求你的服务器正在运行。

于 2021-08-30T17:08:02.460 回答
0
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
于 2021-10-27T05:39:20.823 回答