NODE_ENV变量用于管理开发环境与生产环境的互换。
当为开发环境时,可设置NODE_ENV=development
,当为生产环境时,可设置NODE_ENV=production
.
node_env与app.get('env')的关系:
可通过process.env.NODE_ENV
获取当前系统环境下的环境变量NODE_ENV
的值。
app.set('env') = process.env.NODE_ENV || 'development'
即 当设置了NODE_ENV
变量时,express
的env
的值为NODE_ENV
的值,当没有设置NODE_ENV
变量时,express
的env
默认为development
。
应用实践:(与pm2结合使用)
ecosytem.json文件配置类似如下:
{
"apps" : [
{
"name" : "myapp","script" : "./bin/www","watch" : true,"watch_options": {
"usePolling": true
},"env": {
"COMMON_VARIABLE": "true"
},"env_production" : {
"NODE_ENV": "production"
},"env_development": {
"NODE_ENV": "development"
}
}
],....
}
先说说env与env_的区别
env
为object
类型,用于设置你的应用中要用到的环境变量,如{“NODE_ENV”: “development”,“ID”: “42”}
env_*
也为object
类型,如{“NODE_ENV”: “production”,“ID”: “89”}
,但其只有在运行pm2 start ecosystem.json --env *
命令式时,其设置的环境变量才会被注入到当前应用中。这与env
不同,env
是在启动应用后被自动添加当向前应用中的,不需要运行 --env
参数。
对于env_*
,我们可以定义各种具体的环境变量,以便可轻松的进行各种环境下的切换,方便与开发与部署。如env_dev,env_productiong,env_strage.....
具体说来,按照我上边配置的ecosystem.json
文件,具体如下
"env": {
"COMMON_VARIABLE": "true"
},"env_production" : {
"NODE_ENV": "production"
},"env_development": {
"NODE_ENV": "development"
}
当运行
pm2 start ecosystem.json
时,只有env
选项下的COMMON_VARIABLE
变量被添加到应用的环境变量里。当运行
pm2 start ecosystem.json --env production
时,env
选项下的COMMON_VARIABLE变量
和env_production
选项下的NODE_ENV
变量都被添加到应用的环境变量里了,此时NODE_ENV=production
。当运行
pm2 start ecosystem.json --env development
时,env
选项下的COMMON_VARIABLE
变量和env_development
选项下的NODE_ENV
变量都被添加到应用的环境变量里了,此时NODE_ENV=development
。
可看到就这么简单,只通过--env
参数,就方便的实现了不同工作环境的快速切换。
现在回到项目中,我们设置好了ecosystem.json
,无论是在本地开发环境还是服务器生产环境下,我们都可以用pm2 start ecosystem.json --env *
等命令进行环境模式的方便切换。当然从安全角度考虑,在生产环境下,一定要用--env production
,确保处于生产的安全环境下。
当不带
--env
参数,即默认情况下不设置node_env
环境变量时,app.get('env')= 'development'
,此默认为开发模式。当
--env production
时,设置了node_env=production
,此时app.get('env')= 'production
',此为生成模式。当
--env development
时,设置了node_env=development
,此时app.get('env')= 'development
',此为开发模式。
另外,在本地开发环境下,可通过export NODE_ENV=production
,将其暂时切换到生产模式,可用于在本地调试线上情况。