11

My NX application's npm run build:server calls ng build api-server that triggers the @nrwl/node:build builder.

It builds the NestJS application as main.js. Things work except I wanted process.env.NODE_ENV to be evaluated at runtime but I think it was resolved at build time (via Webpack).

Currently, the value is always set to 'development'.

I am new to Nrwl's NX. Any solution this?

4

6 回答 6

11

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

//process.env.NODE_ENV
process.env['NODE' + '_ENV']
于 2020-01-18T21:43:46.023 回答
8

您看到开发的原因是因为您正在开发模式下构建应用程序 - 在运行时评估不是最佳实践,因为这样构建器就无法做一些花哨的事情来准备构建生产。如果你想要生产,你需要通过添加 --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
于 2020-06-02T17:27:34.843 回答
7

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

会发生什么:

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

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

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

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

于 2021-02-27T11:01:09.387 回答
0

我们遇到了同样的问题,我们最终在 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”

于 2020-10-30T23:23:28.747 回答
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

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

希望能帮助到你。此致。

于 2019-09-30T20:30:50.593 回答
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

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

于 2019-09-26T13:54:40.477 回答