【问题标题】:process.env.NODE_ENV always 'development' when building nestjs app with nrwl nx使用 nrwl nx 构建 nestjs 应用程序时,process.env.NODE_ENV 总是“开发”
【发布时间】:2020-01-25 03:43:46
【问题描述】:

我的 NX 应用程序的 npm run build:server 调用 ng build api-server 触发 @nrwl/node:build 构建器。

它将 NestJS 应用程序构建为main.js。除了我希望在运行时评估 process.env.NODE_ENV 之外,一切正常,但我认为它已在构建时解决(通过 Webpack)。

目前,该值始终设置为“开发”。

我是 Nrwl 的 NX 的新手。这个有什么解决办法吗?

【问题讨论】:

    标签: nestjs nrwl nrwl-nx


    【解决方案1】:

    process.env 确实只在运行时可用。可能发生的情况是您在运行应用程序时没有设置此值。可以问一下你是怎么运行的吗?

    举个简单的例子

    # The following will read the environment variables that are defined in your shell (run `printenv` to see what those are)
    > node main.js
    
    # this will have your variable set
    > NODE_ENV=production node main.js
    
    

    当然,您希望在部署应用程序时将其实际设置在您的环境中,而不是以这种方式传递它,但如果您在本地进行,则可以这样做。

    【讨论】:

    • 我使用“NODE_ENV=xxx node main.js”运行了 webpack 构建的应用程序。 process.env.NODE_ENV 的值仍然是“development”而不是“xxx”。
    【解决方案2】:

    我最近在使用 Express 而不是 Nest 时遇到了同样的问题。 我们为克服这个问题所做的工作是在为我们的任何环境(开发、生产、登台、登台开发)进行编译时添加一些文件替换。这是在 angular.json 文件中完成的,与为 Angular 应用程序替换环境文件的方式相同。

    另一种对我们有用的方法是只加载环境变量一次,然后从该来源检索它们。由于我们的应用依赖 Express 作为后端,因此使用 Express 环境变量:

    import express from 'express';
    
    const _app = express();
    const _env = _app.get('env');
    
    console.log(_env); // shows the right environment value set on NODE_ENV
    

    为了得出这个结论,我们检查了 env 变量的 Express 代码,它确实在内部使用了 process.env.NODE_ENV。

    希望对您有所帮助。最好的问候。

    【讨论】:

      【解决方案3】:

      在 Nx.Dev 工作区中的 NestJs/Nodejs 应用程序中,process.env.NODE_ENV 在从 typescript 到 javascript 的编译过程中被替换为非常“聪明的方式”到“开发”字符串常量(像 NODE_ENV 之类的所有内容都被替换)。我不知道为什么。但我如何才能在运行时获得真正的 NODE_ENV 的唯一方法是这段代码:

      //process.env.NODE_ENV
      process.env['NODE' + '_ENV']
      

      【讨论】:

      • 我遇到了与 NestJs 完全相同的问题,我对您的解决方法感到非常惊讶,但它确实有效,所以谢谢!您介意分享有关 NODE_ENV 覆盖的原因的链接或解释吗?我也很好奇 process.env.NODE_ENV 和 process.env['NODE' + '_ENV'] 在运行时的区别。
      • @ondřej-wagenknecht 我试过了,它确实解决了问题并获得了真正的 NODE_ENV。我想问题是 Nx 覆盖了变量。我也想知道为什么会这样。你有任何链接或解释吗?
      • 是的,这真的很有趣,为什么它有效 - 我只能想到 nx 浏览代码并替换 process.env.NODE_ENV 出现,这个解决方案有效,因为这样拆分它不再匹配正则表达式
      【解决方案4】:

      您看到开发的原因是因为您在开发模式下构建应用程序 - 在运行时评估不是最佳实践,因为这样构建器就无法做一些花哨的事情来准备构建生产。如果你想要生产,你需要通过添加 --prod 标志在生产模式下构建应用程序(就像你需要在生产模式下构建 Angular 一样)。

      如果您需要在生产模式(而不是构建)下为应用提供服务,默认配置不会为您提供服务的 prod 模式。您需要将配置添加到 angular.json。

      所以这段代码:

      "serve": {
            "builder": "@nrwl/node:execute",
            "options": {
              "buildTarget": "api-server:build"
            }
          },
      

      会变成

      "serve": {
            "builder": "@nrwl/node:execute",
            "options": {
              "buildTarget": "api-server:build"
            },
            "configurations": {
              "production": {
                "buildTarget": "api-server:build:production"
              }
            }
          },
      

      然后你就可以运行了

      ng serve --project=api-server --prod
      

      【讨论】:

        【解决方案5】:

        我们遇到了同样的问题,我们最终在 package.json 中使用了 cross-env 包:

        "prodBuild": "cross-env NODE_ENV=production nx run api-server:build:production", "prodServe": "cross-env NODE_ENV=production nx run api-server:serve:production"

        【讨论】:

          【解决方案6】:

          实际上,nx 构建器会将我们源代码中的表达式 process.env.NODE_ENV 替换为 env var(或 nx 模式)的当前值。

          会发生什么:

          由于webpack-define plugin 将查找文本process.env.NODE_ENV,因此很容易使用this answer 中所述的解决方法:

          process.env['NODE'+'_ENV']
          

          警告
          当您需要应用此解决方法来使您的应用程序正常工作时,就会出现问题。由于您已在生产模式下编译应用程序,因此在启动(生产)应用程序时为 NODE_ENV 传递另一个值是没有意义的。
          webpack Production page 包含一些有用的信息。

          我们也遇到过这种情况,问题是,我们依赖 NODE_ENV 变量来为 dev、prod、test 等加载不同的数据库配置。
          我们案例的解决方案是简单地为数据库配置使用单独的 env-vars(例如DB_NAMEDB_PORT、..),这样我们就可以在运行时使用不同的 db-configs 和任何构建变量:dev、产品、测试等。

          【讨论】:

            猜你喜欢
            • 2020-02-05
            • 2021-02-01
            • 2019-05-23
            • 2020-08-29
            • 2021-10-20
            • 2020-08-21
            • 2021-08-22
            • 1970-01-01
            • 2019-09-22
            相关资源
            最近更新 更多