process.env.NODE_ENV未定义


168

我正在尝试遵循有关NodeJ的教程。我不认为我会错过任何事情,但是每当我调用时,process.env.NODE_ENV我得到的唯一值就是不确定的。根据我的研究,默认值应为“开发”。如何动态设置此值以及最初在哪里设置?


为heroku应用程序设置NODE_ENV您可以使用:heroku config:set NODE_ENV="production"
Connor Leech

14
尽管下面的答案可以通过设置环境变量来暂时解决问题,但是更大的教训应该是您永远不会知道是否会设置任何环境变量...因此,请相应地编写代码并测试是否已设置,如果这样,什么。不要对此做任何假设。
Stijn de Witt

Answers:


193

process.env是对您的环境的引用,因此您必须在此处设置变量。

在Windows中设置环境变量

SET NODE_ENV=development

在OS X或Linux上

export NODE_ENV=development

4
您可能还会添加,如果未设置NODE_ENV,则应用程序的行为类似于“开发”模式下
Rocco

1
对于Linux,vi〜/ .bash_profile,然后插入NODE_ENV = development并保存。
stonyau 2014年

6
万一其他人都在挣扎……...“ SET V = VAL”和“ SET V = VAL”之间是有区别的。空间很重要。
威廉

4
请注意,模块“ cross-env”的操作与上述类似,它将在OSX和Windows上都可以使用:“ cross-env NODE_ENV = development”。您需要先安装cross-env:“ npm install cross-env --save”。将其包含在package.json中的脚本中,您可以同时在两个平台上使用。
Antonio Brandao

6
没为我工作。我先export NODE_ENV=development在Mac终端上执行,然后再react-native run-ios从同一终端上执行。调试时,的值process.env.NODE_ENV未定义。
阿什

58

提示

package.json

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

app.js

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

因此,这可能更好:

"start": "set NODE_ENV=dev&& node app.js"

要么

console.log(process.env.NODE_ENV.trim() === 'dev') // true

2
您可以执行以下操作,因此无需进行以下调整:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah

出色的观察,console.log(process.env.NODE_ENV.length) // 4(末尾包含一个空格)
gregn3

1
这是更安全的方法:console.log(('' + process.env.NODE_ENV).trim() === 'dev') // true,因为即使未定义process.env.NODE_ENV,它也不会引发错误。
gregn3

52

对于使用* nix(Linux,OS X等)的用户,没有必要通过第二个export命令来执行此操作,您可以将其链接为调用命令的一部分:

NODE_ENV=development node server.js

比较容易,不是吗?:)


3
类似cross-env的软件包也可以在Windows上运行。
walkerrandophsmith

34

在Windows上使用节点时,我们遇到了这个问题。

我们没有要求尝试运行该应用程序的任何人来设置这些变量,而是在该应用程序内提供了一个备用。

var environment = process.env.NODE_ENV || 'development';

在生产环境中,我们将根据常规方法(SET /导出)对其进行定义。


2
这是最实用的解决方案。
druskacik

12

您可以使用cross-env npm软件包。它将负责修剪环境变量,并确保它可在不同平台上工作。

在项目根目录中,运行:

npm install cross-env

然后在您的package.json中的脚本下,添加:

"start": "cross-env NODE_ENV=dev node your-app-name.js"

然后在终端的项目根目录中,通过运行以下命令启动应用程序:

npm start

然后,该环境变量将在您的应用中以形式提供process.env.NODE_ENV,因此您可以执行以下操作:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}

我认为这行不通。在我当前的项目中对其进行了尝试,而NODE_ENV仍未定义。看来这可能需要更多配置才能正常工作。
Aakash Thakur,

1
我搜索了大约两个小时才能找到此答案,谢谢!
鲍勃

npm install --save-dev cross-env
DalSoft

9

在package.json中,我们必须进行如下配置(适用于Linux和Mac OS)

重要的是下面的构建命令是一个示例之后,“ export NODE_ENV = production”:

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • 对于开发环境,我们必须点击“ npm run dev”命令

  • 对于生产环境,我们必须点击“ npm run start”命令


9

macOS中,对于那些使用Express版本4.x.xDOTENV插件的用户,需要这样使用:

  1. 在安装插件导入后,在初始化应用程序的文件中如下所示: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. 在根目录中,创建一个文件“ .env”并添加以下变量:

    NODE_ENV=development 要么 NODE_ENV = development



1

这是由于操作系统

在package.json文件中,确保具有脚本(其中app.js是要执行的主要js文件,而NODE_ENV在.env文件中声明)。

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

对于窗户

还要设置具有NODE_ENV = development的.env文件变量

如果您的.env文件位于eg.config文件夹的文件夹中,请确保在app.js中指定(您的主js文件)

const dotenv = require('dotenv'); dotenv.config({path:'./config/config.env'});


0

如果您在React中遇到这个问题,则需要react-scripts@0.2.3及更高版本。另外,对于其他环境变量(不是NODE_ENV在React中可用),都需要加上前缀REACT_APP_



-3

您还可以通过代码进行设置,例如:

process.env.NODE_ENV = 'test';


67
我强烈劝阻任何人不要在应用程序逻辑中更改环境标识符。您永远不希望应用程序突然认为它不是真正的东西。正如许多其他答案所暗示的那样,仅应在系统级别更改此设置。
Kafoso 2015年

7
您可能需要阅读12种因素的应用程序:12factor.net/config。此代码将违反该规定。有充分的理由将您的配置与代码分开。
jcollum

1
它可能仅对自动化测试有用,但即使如此,它也可以抽象并注入到您的主代码中,而不是直接从env中读取。
Angelos Pikoulas

我们不要对这个答案太过投票,以免@Kafoso的翔实评论减少了。或将此信息添加到经过深思熟虑的答案中。
Vibhor Dube
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.