nodeJS开发生产环境配置文件加载
nodeJS development and production environment config file loading
基于此处的回答我设置了完全相同的配置选项,但它不起作用。
我的(部分)app.js 文件:
console.log('environment: '+process.env.NODE_ENV);
const config = require('./config/db.json')[process.env.NODE_ENV || "development"];
console.log(config);
我的./config/db.json 文件:
{
"development":{
"host":"localhost",
"port":"3306",
"username":"root",
"password":"",
"database":"dbname"
},
"production":{
"host":"production-host",
"port":"3306",
"username":"user",
"password":"pwd",
"database":"dbname"
}
}
Console.log 输出:
environment: development
undefined
和应用程序崩溃。知道为什么吗?文件在那里,如果我删除 require() 的 [...] 部分,它会打印出 db.json 文件,并打印出 undefined.
编辑
我试图在 require() 之后添加 console.log(typeof config)
以查看我得到了什么,我注意到如果我 require('./config/db.json')[process.env.NODE_ENV]
我得到 undefined
,但如果我 require('./config/db.json')["development"]
我取回正确的对象。
版本:
nodeJS 6.11.4
express 4.16.2
您应该将配置导出为变量:
const config = {
"development":{
"host":"localhost",
"port":"3306",
"username":"root",
"password":"",
"database":"dbname"
},
"production":{
"host":"production-host",
"port":"3306",
"username":"user",
"password":"pwd",
"database":"dbname"
}
};
module.exports = config;
这样就可以找到:)
如果您想通过 JSON 完成:
const fs = require('fs')
let localConfig
try {
localConfig = JSON.parse((fs.readFileSync('./config/db.json', 'utf-8'))
} catch (e) {
console.log('Could not parse local config.')
localConfig = false
}
module.exports = localConfig
然后您可以为生产添加逻辑,如果没有本地配置 localConfig
将 return false 并且您可以寻找此时注入的环境变量。
更新:
我看到你自己给了生产配置,这样你就可以根据环境访问你需要的密钥。只需导入 localConfig
并使用您需要的密钥。
经过多次调试和网上搜索,终于找到了解决办法。问题是我在 Windows 机器上使用 npm run dev
命令,而我的 "dev" 命令看起来像 SET NODE_ENV=development && nodemon server.js
.
有眼力的人会注意到&&前面有个space,它在变量development
后面加了一个space,所以变量我是比较对象是 "development "
而不是我想的 "development"
。
所以,其他问题的原始答案确实有效,并且确实加载了正确的配置!
为此最好使用 dotenv 包
npm i dotenv
Step 1: In package.json add this
"scripts": {
"start": "nodemon app.js",
"dev": "NODE_ENV=dev nodemon app.js"
"prod": "NODE_ENV=prod nodemon app.js"
},
Step 2: Add .env.prod and .env.dev files
.env.dev
PORT=7200
# Set your database/API connection information here
DB_URI=localhost
DB_USERNAME=root
DB_PASSWORD=password
DB_DEFAULT=dbName
Step 3: Add this in config.js
const dotenv = require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` });
const result = dotenv;
if (result.error) {
throw result.error;
}
const { parsed: envs } = result;
// console.log(envs);
module.exports = envs;
Step 4: Use like this when needed
const {
DB_URI, DB_USERNAME, DB_PASSWORD, DB_DEFAULT,
} = require('../config');
现在如果你想发展,运行
npm run dev
对于产品,使用
npm run prod
基于此处的回答我设置了完全相同的配置选项,但它不起作用。
我的(部分)app.js 文件:
console.log('environment: '+process.env.NODE_ENV);
const config = require('./config/db.json')[process.env.NODE_ENV || "development"];
console.log(config);
我的./config/db.json 文件:
{
"development":{
"host":"localhost",
"port":"3306",
"username":"root",
"password":"",
"database":"dbname"
},
"production":{
"host":"production-host",
"port":"3306",
"username":"user",
"password":"pwd",
"database":"dbname"
}
}
Console.log 输出:
environment: development
undefined
和应用程序崩溃。知道为什么吗?文件在那里,如果我删除 require() 的 [...] 部分,它会打印出 db.json 文件,并打印出 undefined.
编辑
我试图在 require() 之后添加 console.log(typeof config)
以查看我得到了什么,我注意到如果我 require('./config/db.json')[process.env.NODE_ENV]
我得到 undefined
,但如果我 require('./config/db.json')["development"]
我取回正确的对象。
版本:
nodeJS 6.11.4
express 4.16.2
您应该将配置导出为变量:
const config = {
"development":{
"host":"localhost",
"port":"3306",
"username":"root",
"password":"",
"database":"dbname"
},
"production":{
"host":"production-host",
"port":"3306",
"username":"user",
"password":"pwd",
"database":"dbname"
}
};
module.exports = config;
这样就可以找到:)
如果您想通过 JSON 完成:
const fs = require('fs')
let localConfig
try {
localConfig = JSON.parse((fs.readFileSync('./config/db.json', 'utf-8'))
} catch (e) {
console.log('Could not parse local config.')
localConfig = false
}
module.exports = localConfig
然后您可以为生产添加逻辑,如果没有本地配置 localConfig
将 return false 并且您可以寻找此时注入的环境变量。
更新:
我看到你自己给了生产配置,这样你就可以根据环境访问你需要的密钥。只需导入 localConfig
并使用您需要的密钥。
经过多次调试和网上搜索,终于找到了解决办法。问题是我在 Windows 机器上使用 npm run dev
命令,而我的 "dev" 命令看起来像 SET NODE_ENV=development && nodemon server.js
.
有眼力的人会注意到&&前面有个space,它在变量development
后面加了一个space,所以变量我是比较对象是 "development "
而不是我想的 "development"
。
所以,其他问题的原始答案确实有效,并且确实加载了正确的配置!
为此最好使用 dotenv 包
npm i dotenv
Step 1: In package.json add this
"scripts": {
"start": "nodemon app.js",
"dev": "NODE_ENV=dev nodemon app.js"
"prod": "NODE_ENV=prod nodemon app.js"
},
Step 2: Add .env.prod and .env.dev files
.env.dev
PORT=7200
# Set your database/API connection information here
DB_URI=localhost
DB_USERNAME=root
DB_PASSWORD=password
DB_DEFAULT=dbName
Step 3: Add this in config.js
const dotenv = require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` });
const result = dotenv;
if (result.error) {
throw result.error;
}
const { parsed: envs } = result;
// console.log(envs);
module.exports = envs;
Step 4: Use like this when needed
const {
DB_URI, DB_USERNAME, DB_PASSWORD, DB_DEFAULT,
} = require('../config');
现在如果你想发展,运行
npm run dev
对于产品,使用
npm run prod