使用 nrwl nx 构建 nestjs 应用程序时,process.env.NODE_ENV 总是“开发”

kct*_*ang 7 nrwl nestjs nrwl-nx

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

它将 NestJS 应用程序构建为main.js. 除了我想process.env.NODE_ENV在运行时进行评估之外,其他事情都有效,但我认为它在构建时(通过 Webpack)解决了。

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

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

Ond*_*cht 9

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

//process.env.NODE_ENV
process.env['NODE' + '_ENV']
Run Code Online (Sandbox Code Playgroud)

  • 我在 NestJs 上遇到了完全相同的问题,我对你的解决方法感到非常惊讶,但它有效,所以谢谢你!您介意分享有关覆盖 NODE_ENV 的原因的链接或解释吗?我真的很好奇 process.env.NODE_ENV 和 process.env['NODE' + '_ENV'] 之间运行时的差异。 (4认同)
  • 是的,这真的很有趣,为什么它有效 - 我只能想到 nx 查看代码并替换 `process.env.NODE_ENV` 事件,并且这个解决方案有效,因为像这样分割它不再匹配正则表达式 (2认同)

TmT*_*ron 8

事实上,nx 构建器会将源代码中的表达式替换process.env.NODE_ENV为环境变量(或 nx-mode)的当前值。

发生的事情是这样的:

由于webpack-define 插件将查找文本process.env.NODE_ENV,因此很容易使用此答案中解释的解决方法:

process.env['NODE'+'_ENV']
Run Code Online (Sandbox Code Playgroud)

警告
当您需要应用此解决方法以使您的应用程序正常运行时,则说明出现了问题。NODE_ENV由于您已在生产模式下编译应用程序,因此在启动(生产)应用程序时传递另一个值是没有意义的。
webpack Production 页面包含一些有用的信息。

我们也遇到过这种情况,问题是,我们依赖变量NODE_ENV来加载开发、生产、测试​​等不同的数据库配置。
我们案例的解决方案是简单地为数据库配置使用单独的环境变量(例如DB_NAME, DB_PORT, ..),这样我们就可以在运行时对任何构建变体使用不同的数据库配置:dev、prod、test 等。


Wil*_*ely 5

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

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

所以这段代码:

"serve": {
      "builder": "@nrwl/node:execute",
      "options": {
        "buildTarget": "api-server:build"
      }
    },
Run Code Online (Sandbox Code Playgroud)

会成为

"serve": {
      "builder": "@nrwl/node:execute",
      "options": {
        "buildTarget": "api-server:build"
      },
      "configurations": {
        "production": {
          "buildTarget": "api-server:build:production"
        }
      }
    },
Run Code Online (Sandbox Code Playgroud)

然后你可以运行

ng serve --project=api-server --prod
Run Code Online (Sandbox Code Playgroud)


ele*_*ead -4

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

Run Code Online (Sandbox Code Playgroud)

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

  • 我使用“NODE_ENV=xxx node main.js”运行了 webpack 构建的应用程序。process.env.NODE_ENV 的值仍然是“development”而不是“xxx”。 (3认同)