【问题标题】:nodeJS development and production environment config file loadingnodeJS开发和生产环境配置文件加载
【发布时间】:2018-03-27 02:54:13
【问题描述】:

基于这里https://stackoverflow.com/a/22524056/777700的这个答案,我设置了完全相同的配置选项,但它不起作用。

我的(部分)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

【问题讨论】:

  • 请告诉我您正在尝试什么,因为您似乎还没有定义您的 NODE_ENV 环境值...
  • 它应该在你的 bashrc 文件中,或者你可以喜欢这个NODE_ENV=development node app.js

标签: json node.js express require


【解决方案1】:

为此最好使用 dotenv 包

npm i dotenv

第 1 步:在 package.json 中添加这个

"scripts": {
    "start": "nodemon app.js",
    "dev": "NODE_ENV=dev nodemon app.js"
    "prod": "NODE_ENV=prod nodemon app.js"
  },

第 2 步:添加 .env.prod 和 .env.dev 文件

.env.dev

PORT=7200
# Set your database/API connection information here
DB_URI=localhost
DB_USERNAME=root
DB_PASSWORD=password
DB_DEFAULT=dbName

第 3 步:在 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;

第 4 步:需要时像这样使用

const {
  DB_URI, DB_USERNAME, DB_PASSWORD, DB_DEFAULT,
} = require('../config');

现在如果你想开发,运行

npm run dev

对于产品,使用

npm run prod

【讨论】:

    【解决方案2】:

    经过更多的调试和在线搜索,我终于找到了解决方案。问题是我在 Windows 机器上使用npm run dev 命令,而我的“dev”命令看起来像SET NODE_ENV=development && nodemon server.js

    有经验的人会注意到&&之前有一个空格,它在变量development后面添加了一个空格,所以我要比较的变量是"development ",而不是我想的"development" .

    因此,其他问题的原始答案确实有效,并且确实加载了正确的配置!

    【讨论】:

      【解决方案3】:

      如果你想通过 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 将返回 false,您可以查找此时注入的环境变量。

      更新:

      我看到您自己提供了生产配置,在这种情况下,您可以根据环境访问所需的密钥。只需导入 localConfig 并使用您需要的密钥。

      【讨论】:

        【解决方案4】:

        您应该将配置导出为变量:

        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;
        

        这样就可以找到了:)

        【讨论】:

        • 只需使用 .js 扩展名
        猜你喜欢
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 2012-04-05
        • 2017-12-20
        • 2011-02-27
        相关资源
        最近更新 更多