nodeJS开发和生产环境配置文件加载

时间:2017-10-15 13:59:53

标签: json node.js express require

基于此答案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文件,用它打印出未定义的文件。

修改 我尝试在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

4 个答案:

答案 0 :(得分:0)

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

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;

通过这种方式可以找到:)

答案 1 :(得分:0)

如果你想通过JSON:

 if (this.Padding != default(Thickness))
                {
                    Device.BeginInvokeOnMainThread(() =>
                      {

                          if (Parent is Grid)
                          {
                              var parentAsGrid = Parent as Grid;
                              var index = parentAsGrid.Children.IndexOf(this);
                              parentAsGrid.Children.Remove(this);
                              Grid marginGrid = new Grid() { BackgroundColor = this.BackgroundColor,  HorizontalOptions = this.HorizontalOptions, VerticalOptions = this.VerticalOptions };


                              var lbl = new Label() { Text = this.Text, TextColor = this.TextColor, BackgroundColor = this.BackgroundColor, HorizontalOptions = this.HorizontalOptions, VerticalOptions = this.VerticalOptions, FontSize = this.FontSize };
                              lbl.Margin = this.Padding;
                              if (!parentAsGrid.Children.Contains(this))
                              {
                                  marginGrid.Children.Add(lbl);
                                  parentAsGrid.Children.Insert(index, marginGrid);
                              }

                          }
                          if (Parent is StackLayout)
                          {
                              var parentAsGrid = Parent as StackLayout;
                              var index = parentAsGrid.Children.IndexOf(this);
                              parentAsGrid.Children.Remove(this);
                              Grid marginGrid = new Grid() { BackgroundColor = this.BackgroundColor,   HorizontalOptions = this.HorizontalOptions, VerticalOptions = this.VerticalOptions };


                              var lbl = new Label() { Text = this.Text, TextColor = this.TextColor, BackgroundColor = this.BackgroundColor, HorizontalOptions = this.HorizontalOptions, VerticalOptions = this.VerticalOptions, FontSize = this.FontSize };
                              lbl.Margin = this.Padding;
                              if (!parentAsGrid.Children.Contains(this))
                              {
                                  marginGrid.Children.Add(lbl);
                                  parentAsGrid.Children.Insert(index, marginGrid);
                              }

                          }



                      });

然后,您可以为生产添加逻辑,如果没有本地配置,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 将返回false,您可以查找此时注入的环境变量。

更新

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

答案 2 :(得分:0)

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

有经验的人会在&&& 之前注意到空格,这会在变量development后面添加一个空格,因此我所比较的变量是"development "而不是正如我想的那样"development"

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

答案 3 :(得分:0)

为此最好使用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