为什么process.env.NODE_ENV没有被定义?

回答 21 浏览 47.3万 2012-06-19

我正在努力学习NodeJS的教程。我不认为我错过了什么,但每当我调用process.env.NODE_ENV的时候,我得到的唯一值是undefined。根据我的研究,默认值应该是development。这个值是如何动态设置的,它最初是在哪里设置的?

basheps 提问于2012-06-19
为heroku应用程序设置NODE_ENV,你可以使用。heroku config:set NODE_ENV="production"Connor Leech 2014-06-17
虽然下面的答案会通过设置环境变量暂时解决这个问题,但这里更大的教训是,你永远不可能知道任何环境变量是否会被设置......。所以要相应地编写你的代码,并测试它是否被设置,如果是的话,设置成什么。不要对它做假设。Stijn de Witt 2015-12-16
这是否回答了你的问题?如何在OS X中设置NODE_ENV为生产/开发Michael Freidgeim 2021-01-04
21 个回答
#1楼 已采纳
得票数 288

process.env是对你的环境的引用,所以你必须在那里设置这个变量。

要设置Windows中的环境变量,

SET NODE_ENV=development

在macOS / OS X或Linux上使用。

export NODE_ENV=development
James Tikalsky 提问于2012-06-19
Audwin Oyong 修改于2021-09-30
你可以补充说,如果没有设置NODE_ENV,应用程序的行为就像在"开发"模式下一样。Rocco 2013-09-21
对于Linux, vi ~/.bash_profile,然后插入NODE_ENV=development,并保存。stonyau 2014-10-12
为了防止其他人挣扎......"SET V = VAL"和"SET V=VAL"之间存在区别。空间很重要。willem 2016-03-14
请注意,模块"cross-env"要做的事情与上述类似,而且它在OSX和Windows上都能工作:"cross-env NODE_ENV=development"。你需要先安装cross-env:"npm install cross-env --save"。在你的package.json中的一个脚本中,你就可以在两个平台上运行了。Antonio Brandao 2016-06-09
对我来说并不奏效。我在我的Mac终端上执行了export NODE_ENV=development,然后在同一终端上做了react-native run-ios。调试时,process.env.NODE_ENV的值是未定义的。Ash 2019-06-26
#2楼
得票数 101

小贴士

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
kenberkeley 提问于2016-08-15
kenberkeley 修改于2016-08-15
你可以这样做,这样你就不用修剪了。"start": "set NODE_ENV=dev&& node app.js"Bernardo Dal Corno 2018-12-19
观察得很好,console.log(process.env.NODE_ENV.length) //4(包括末尾的空格)gregn3 2020-06-08
使用SET使启动脚本仅限于Windows系统。Quanta 2020-09-29
你可以这样做来解决空间问题。"start": "export NODE_ENV='dev' && ...".所以要把环境放在两个'之间。erkage 2021-07-11
千万不要在package.json中硬编码windows特有的东西。Roko C. Buljan 2021-11-24
#3楼
得票数 67

对于使用*nix(Linux、OS X等)的人来说,没有理由通过第二条导出命令来做,你可以把它作为调用命令的一部分连锁起来。

NODE_ENV=development node server.js

更容易,不是吗?:)

mlaccetti 提问于2014-06-15
像cross-env这样的软件包将使其在windows上也能正常工作。walkerrandophsmith 2016-09-06
#4楼
得票数 53

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

我们没有要求任何试图运行应用程序的人设置这些变量,而是在应用程序中提供了一个后备方案。

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

在生产环境中,我们会按照通常的方法(SET/导出)来定义它。

Jacob 提问于2015-07-24
这是最务实的解决方案。druskacik 2019-09-14
如果process.env.NODE_ENV的值是未定义的,而用户想在.env文件中把开发版改为生产版,那该怎么办?Kiran RS 2021-03-17
当使用typescript strictNullChecks时,这个方法非常好用。java-addict301 2021-09-17
#5楼
得票数 22

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

在项目根目录下,运行。

npm install cross-env

然后在你的package.json中,在scripts项下,添加。

"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
}
Liran H 提问于2018-12-29
我认为这不起作用。在我目前的项目中尝试了一下,NODE_ENV仍然是未定义的。看来这可能需要更多的配置才能工作。Aakash Thakur 2019-05-05
npm install --save-dev 跨环境DalSoft 2020-02-08
对我来说,所接受的答案不知何故没有作用,但这个<3Chathura Buddhika 2021-04-06
对我来说,它在本地机器的windows上也不工作。NODE_ENV仍然没有定义。rendom 2021-09-12
#6楼
得票数 16

在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 "命令。

D V Yogesh 提问于2019-02-13
D V Yogesh 修改于2019-02-14
当我这样做时,我得到的错误是:'export'没有被识别为内部或外部的命令、可操作的程序或批处理文件。Casivio 2021-03-03
@Casivio在Windows上,使用set而不是export"scripts": { "start": "set NODE_ENV=production && npm run build && npm run start-server" }cweave 2022-01-02
#7楼
得票数 15

macOS中,对于那些使用Express版本4.x.x和使用DOTENV插件的人来说,需要像这样使用。

  1. 安装该插件后,在你启动应用程序的文件中导入如下内容:require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. 在根目录下创建一个文件'.env',并添加类似的变体。

    NODE_ENV=developmentNODE_ENV = development

NRP 提问于2018-12-08
NRP 修改于2019-06-27
#8楼
得票数 9

在你的应用程序中,尽可能早地要求和配置dotenv。

require('dotenv').config()

Khushwant kodecha 提问于2020-07-03
对我来说就是这样,我把这个放进了我的main.tsxaphod 2021-04-07
这。这就是解决方案。不要在你的package.json中塞入环境变量。Scott 2022-01-09
#9楼
得票数 7

在UBUNTU的使用中。

$ 出口 NODE_ENV=测试

Gilbert Flamino 提问于2014-02-14
@gilbert-flamino所指出的方法对我有用。只是为了更明确。在Windows上。"dev": "set NODE_ENV=development&& npx nodemon bin/www", 在Ubuntu上。"dev": "export NODE_ENV=development&& npx nodemon bin/www",dixoen 2022-06-21
#10楼
得票数 3

安装dotenv模块 ( npm i dotenv --save )

require('dotenv').config() //写在你要使用变量的文件里面。

console.log(process.env.NODE_ENV) //返回存储在.env文件中的值。

PRIYESH N D 提问于2022-01-13
#11楼
得票数 1

这是由于操作系统的原因。

在你的package.json中,确保有你的scripts(其中app.js是你要执行的主要js文件&;NODE_ENV是在.env文件中声明的)。

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

对于窗口

同时设置你的.env文件中的变量NODE_ENV=development。

如果你的.env文件在一个文件夹中,例如.config文件夹,请确保在app.js(你的主js文件)中指定。

常量 dotenv = 要求('dotenv'); dotenv.config({ path: './config/config.env' });

Adrian Almeida 提问于2020-05-06
#12楼
得票数 1

你可以使用npm的dotenv包,这里是链接。https://www.npmjs.com/package/dotenv

这允许你将所有的配置放在一个.env文件中

Ahsan Farooq 提问于2021-05-28
看起来envalid不再与dotenv一起提供,所以你现在需要在调用envalid'的cleanEnv()之前手动安装/调用它。这让我大吃一惊,所以把这个留在这里给别人看。Stretch0 2021-09-20
#13楼
得票数 1

必须是app.js中的第一个requirement。

npm install dotenv

require("dotenv").config();
MonsterPHP 提问于2022-03-24
#14楼
得票数 1

在我的案例中,我有一个节点应用程序。我的结构方式是,我有客户端文件夹和服务器文件夹。我把我的.env文件放在这两个文件夹里。我的服务器文件需要这个.env文件。它被返回未定义,因为它不在服务器文件内。这是个疏忽。

App
-client
-server
-.env

Instead I moved .env inside server file like so:

App
-client
-server
 |-.env <---here
 |-package.json
 |-and the rest of the server files...

(before this - ofcourse have the dotenv npm package installed and follow its doc)
Gel 提问于2022-06-25
#15楼
得票数 0

如果你在React中遇到这个问题,你需要react-scripts@0.2.3,甚至更高。此外,除了NODE_ENV之外,其他环境变量在React中也需要以REACT_APP_为前缀。

Daniel B 提问于2020-04-11
#16楼
得票数 0

对我来说,问题在于我使用pkg库来将我的应用程序变成可执行的二进制文件。在这种情况下,公认的解决方案并不奏效。然而,使用下面的代码解决了我的问题。

const NODE_ENV = (<any>process).pkg ? 'production' : process.env.NODE_ENV;

我在GitHub上找到了这个解决方案在这里

Jon 提问于2020-11-20
#17楼
得票数 0

在Electron Js中

"scripts": {
    "start": "NODE_ENV=development electron index.js",
},
Vigneshwaran Chandrasekaran 提问于2021-03-15
#18楼
得票数 0

如果你定义了任何名称为process的函数,那么这也可能导致这个问题。

Saurabh Joshi 提问于2021-05-05
#19楼
得票数 0

在package.json中为Windows/Mac/Linux定义process.env.NODE_ENV。

以下是在我的Mac上的工作情况(MacBook Pro 2019,16英寸,大苏尔)。

"scripts": {
    "build": "export NODE_ENV=prod || set NODE_ENV=prod&& npx eslint . && node --experimental-json-modules ./backend/app.js && gulp",
},

使用export NODE_ENV=prod || set NODE_ENV=prod&& 字符串可能在Windows和Linux中工作,但我还没有测试过。

如果有人能确认,那将是很好的。

不幸的是,在我的package.json文件中,使用cross-env npm package对我来说完全没有@NOT的作用,我在Mac上花了很长时间试图使这个工作正常。

risingPhoenix1979 提问于2021-10-28
#20楼
得票数 0

我也遇到了这个问题,我把.env文件移到了根文件夹(不是项目文件夹,高了一级),结果就成功了。

检查一下。它可能对你也有帮助。

Daniil 提问于2021-12-03
HMilbradt 修改于2021-12-04
#21楼
得票数 -4

你也可以通过代码来设置,比如说。

process.env.NODE_ENV = 'test';

joaquindev 提问于2014-02-06
Muhammad Omar ElShourbagy 修改于2017-10-30
我非常不鼓励任何人在应用逻辑中改变环境标识符。你永远不希望应用程序突然认为它是别的东西,而不是真正的东西。正如许多其他答案所建议的那样,这应该只在系统层面上改变。Kafoso 2015-07-07
你可能想阅读关于12个因素的应用程序。12factor.net/config。这段代码将是对它的一种违反。有很好的理由让你的配置与你的代码分开。jcollum 2017-07-28
它可能只对自动化测试有用,但即使如此,它也可以被抽象化并注入到你的主代码中,而不是直接从env中读取。Angelos Pikoulas 2018-11-21
我们不要把这个答案降权,以至于@Kafoso的信息评论被削弱了。或者将这一信息添加到一些投票率高的答案中。Vibhor Dube 2020-06-17
那么,如果有人用webpack打包了一个Web应用程序,并在nginx中运行,会怎么样呢?Mario Eis 2022-09-24