使用nrwl nx构建nestjs应用时,process.env.NODE_ENV始终“开发”

时间:2019-09-25 01:42:18

标签: nestjs nrwl nrwl-nx

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

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

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

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

6 个答案:

答案 0 :(得分:3)

在Nx.Dev工作区中的NestJs / Nodejs应用程序中,从打字稿到javascript的编译过程非常“聪明”地替换为“开发”字符串常量(替换了NODE_ENV之类的东西)时,替换了Nx.Dev工作区中的process.env.NODE_ENV。我不知道为什么但是,只有这样,我才能在运行时获得真正的NODE_ENV:

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

答案 1 :(得分:3)

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

这是怎么回事:

由于定义插件将查找文本 process.env.NODE_ENV,因此很容易使用 this answer 中所述的解决方法:

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

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

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

答案 2 :(得分:1)

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

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

所以这段代码:

data

将成为

"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"
        }
      }
    },

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

import express from 'express';

const _app = express();
const _env = _app.get('env');

console.log(_env); // shows the right environment value set on NODE_ENV

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

希望有帮助。最好的问候。

答案 5 :(得分:0)

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

“ prodBuild”:“跨环境NODE_ENV = production nx运行api-server:build:production”, “ prodServe”:“跨环境NODE_ENV = production nx运行api-server:serve:production”