我的NX应用程序的npm run build:server
调用ng build api-server
触发了@nrwl/node:build
构建器。
它将NestJS应用程序构建为main.js
。一切正常,除了我希望process.env.NODE_ENV
在运行时进行评估,但我认为它已在构建时解决(通过Webpack)。
当前,该值始终设置为“开发”。
我是Nrwl的NX的新手。有什么解决办法吗?
答案 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
:由于定义插件将查找文本 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”