【问题标题】:Why is process.env.NODE_ENV undefined?为什么 process.env.NODE_ENV 未定义?
【发布时间】:2012-06-21 16:09:11
【问题描述】:

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

【问题讨论】:

  • 为您可以使用的 Heroku 应用设置 NODE_ENV:heroku config:set NODE_ENV="production"
  • 虽然下面的答案会通过设置环境变量暂时解决问题,但这里更大的教训应该是你永远不知道是否会设置任何环境变量......所以相应地编写你的代码并测试它是否已设置,如果是,设置为什么。不要对此做任何假设。

标签: javascript node.js


【解决方案1】:

我也遇到过这个问题。 我将 .env 文件移动到根文件夹(不是项目文件夹,更高级别),它成功了。

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

【讨论】:

    【解决方案2】:

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

    以下是在我的 Mac(MacBook Pro 2019,16 英寸,Big Sur)上对我有用的方法:

    "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 上尝试完成这项工作.

    【讨论】:

      【解决方案3】:

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

      设置environment variable in Windows

      SET NODE_ENV=development
      

      在 macOS / OS X 或 Linux:

      export NODE_ENV=development
      

      【讨论】:

      • 您可能会补充说,如果未设置 NODE_ENV,则应用的行为类似于“开发”模式
      • 对于 Linux,vi ~/.bash_profile,然后插入 NODE_ENV=development 并保存。
      • 万一其他人遇到困难......“SET V = VAL”和“SET V=VAL”之间是有区别的。空间很重要。
      • 请注意,“cross-env”模块的作用与上述类似,并且它适用于 OSX 和 Windows:“cross-env NODE_ENV=development”。您需要先安装 cross-env:“npm install cross-env --save”。在你的 package.json 中的脚本中包含它,你可以在两个平台上使用。
      • 对我不起作用。我在我的 Mac 终端上执行了export NODE_ENV=development,然后从同一个终端执行了react-native run-ios。调试时process.env.NODE_ENV的值未定义。
      【解决方案4】:

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

      这允许您将所有配置放在.env 文件中

      【讨论】:

      • 看起来 envalid 不再随 dotenv 一起提供,因此您现在需要在调用 envalid 的 cleanEnv() 之前手动安装/调用它。这引起了我的注意,所以将其留给其他人
      【解决方案5】:

      如果您使用名称 process 定义任何函数,那么这也可能导致此问题。

      【讨论】:

        【解决方案6】:

        在电子 Js 中

        "scripts": {
            "start": "NODE_ENV=development electron index.js",
        },
        

        【讨论】:

          【解决方案7】:

          对我来说,问题在于我使用 pkg library 将我的应用程序转换为可执行二进制文件。在这种情况下,公认的解决方案不起作用。但是,使用以下代码解决了我的问题:

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

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

          【讨论】:

            【解决方案8】:

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

            require('dotenv').config()

            【讨论】:

            • 这是给我的,我把它放在我的main.ts
            【解决方案9】:

            这是由于操作系统

            在你的 package.json 中,确保有你的脚本(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 文件位于 eg.config 文件夹中,请确保在 app.js(您的主 js 文件)中指定

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

            【讨论】:

              【解决方案10】:

              如果你在 React 中遇到过这个问题,你需要 react-scripts@0.2.3 及更高版本。此外,对于除NODE_ENV 之外的其他环境变量在 React 中工作,它们需要以 REACT_APP_ 为前缀。

              【讨论】:

                【解决方案11】:

                ma​​cOS中,使用4.x.x的express版本和使用DOTENV插件的用户,需要这样使用:

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

                2. 在根目录创建一个文件'.env'并添加如下变量:

                  NODE_ENV=development 要么 NODE_ENV = development

                【讨论】:

                  【解决方案12】:

                  在 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”命令

                  【讨论】:

                  • 当我这样做时,我收到错误:'export' 不是内部或外部命令、可运行程序或批处理文件。
                  • @Casivio 在 Windows 上,使用 set 而不是 export"scripts": { "start": "set NODE_ENV=production &amp;&amp; npm run build &amp;&amp; npm run start-server" }
                  【解决方案13】:

                  您可以使用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
                  }
                  

                  【讨论】:

                  • 我认为这行不通。在我当前的项目中尝试过,NODE_ENV 仍然未定义。这似乎需要更多的配置才能工作。
                  • npm install --save-dev cross-env
                  • 对我来说不知何故接受的答案不起作用,但这
                  • 对我来说,它在本地机器窗口上也不起作用。 NODE_ENV 仍未定义
                  【解决方案14】:

                  也可以通过代码设置,例如:

                  process.env.NODE_ENV = 'test';

                  【讨论】:

                  • 我强烈劝阻任何人不要更改应用程序逻辑中的环境标识符。您永远不希望应用程序突然认为它与实际不同。正如许多其他答案所暗示的那样,这应该只在系统级别进行更改。
                  • 您可能想了解 12 因子应用程序:12factor.net/config。该代码将违反该规定。将配置与代码分开是有充分理由的。
                  • 它可能只对自动化测试有用,但即便如此,它也可以被抽象并注入到您的主代码中,而不是直接从 env 中读取。
                  • 我们不要过分反对这个答案,以至于@Kafoso 的信息性评论被削弱了。或者将此信息添加到一些投票得当的答案中。
                  【解决方案15】:

                  提示

                  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
                  

                  【讨论】:

                  • 能做的就是这个,不用修剪了:"start": "set NODE_ENV=dev&amp;&amp; node app.js"
                  • 观察力很好,console.log(process.env.NODE_ENV.length)// 4(包括最后一个空格)
                  • 这样更安全:console.log(('' + process.env.NODE_ENV).trim() === 'dev') // true,因为即使 process.env.NODE_ENV 未定义,它也不会抛出错误。
                  • 使用SET 使启动脚本仅限于Windows。
                  • 您可以这样做来解决空间问题:"start": "export NODE_ENV='dev' &amp;&amp; ..."。所以把环境放在两个'之间。
                  【解决方案16】:

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

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

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

                  在生产环境中,我们将按照常用方法(SET/export)定义它。

                  【讨论】:

                  • 这是最务实的解决方案。
                  • 如果 process.env.NODE_ENV 的值未定义并且用户想在 .env 文件中将开发更改为生产怎么办?
                  • 这在使用 typescript strictNullChecks 时效果很好
                  【解决方案17】:

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

                  NODE_ENV=development node server.js
                  

                  更简单,不是吗? :)

                  【讨论】:

                  • 像 cross-env 这样的包也可以在 Windows 上工作。
                  【解决方案18】:

                  在 UBUNTU 中使用:

                  $ export NODE_ENV=test

                  【讨论】:

                    猜你喜欢
                    • 2021-11-04
                    • 2022-01-05
                    • 1970-01-01
                    • 2019-12-05
                    • 2016-06-10
                    • 2021-08-10
                    • 2020-05-12
                    • 2021-07-22
                    • 2021-07-18
                    相关资源
                    最近更新 更多