在Node.Js / Express应用程序中存储数据库配置的最佳方法


69

在运行在node.js / Express上的开源应用程序中存储数据库配置(用户名,密码)的最佳方法是什么?两个具体问题:

  1. 例如,我是否应该将其放入文件/lib夹中的单独config.js文件中,并且永远不要将其包含在GitHub上公开可用的主存储库中?

  2. 要包括配置,它是否像require('./config.js')需要它的文件一样简单,或者有更好的方法呢?

PS很抱歉,如果问题看起来有点简单或表达方式不够好,但我才刚刚开始:)

Answers:


24

不确定这是否是最佳做法,但就我个人而言,我有一个config.json文件,用于存储数据库连接信息。然后,我执行以下操作:

// options.js
var fs = require('fs'),
configPath = './config.json';
var parsed = JSON.parse(fs.readFileSync(configPath, 'UTF-8'));
exports.storageConfig=  parsed;

然后从另一个文件中执行以下操作:

var options = require('./options');

var loginData = {
        host: options.storageConfig.HOST,
        user: options.storageConfig.user,
        password: options.storageConfig.password
};

1
万一这对任何人都有帮助-我将配置文件存储在/ config目录中,并且正在获取Error: ENOENT, no such file or directory './config.json'。该解决方案为我工作,当我改变了configPath = './config.json'configPath = __dirname + '/config.json'options.js。见@ loganfsmyth的评论在这里:stackoverflow.com/questions/13541948/...
ozandlb

@anvarik为什么不简单地将配置文件作为JSON对象并将其导出为Node模块。这样您就可以在任何需要的地方简单地要求它?
Kamalakannan J

8
在服务器上包含机密凭据的文件不是大问题吗?如果是这样,那么此答案无济于事,我们还应该怎么办?有人说我们应该使用环境变量-但有人认为它们也很危险,因为服务器上的任何程序都可以读取它们。
莫里斯

1
@Vic我也有同样的担忧。我一直在寻找一个可以解密加密配置文件的NodeJS库,但是当我偶然发现它并没有看到任何人建议这样做时,我以为我会发疯。很高兴看到其他人也在想同样的事情。
Matthew Zackschewski

1
我发现这条路要走,因为我们有配置文件,该文件具有不同的键,这些键在不同的环境中需要不同的值。使用webpack,我们将解决方案捆绑在单个文件中。这样就救了我们。此外,我们不会在存储库中存储机密信息-并且在部署过程中,凭据将被json文件中的实际值替换。
Neeraj Gulia

113

这是我的方法:

创建一个config.js,其中包含代表您的配置的对象:

var config = {
development: {
    //url to be used in link generation
    url: 'http://my.site.com',
    //mongodb connection settings
    database: {
        host:   '127.0.0.1',
        port:   '27017',
        db:     'site_dev'
    },
    //server details
    server: {
        host: '127.0.0.1',
        port: '3422'
    }
},
production: {
    //url to be used in link generation
    url: 'http://my.site.com',
    //mongodb connection settings
    database: {
        host: '127.0.0.1',
        port: '27017',
        db:     'site'
    },
    //server details
    server: {
        host:   '127.0.0.1',
        port:   '3421'
    }
}
};
module.exports = config;

然后在我的index.js(或实际位置)中,

var env = process.env.NODE_ENV || 'development';
var config = require('./config')[env];

然后处理该对象,例如

var server = express();
server.listen(config.server.port);
...

太棒了...确实可以帮助您,节省了大量时间。
Wcan

我有一个问题,我该如何在角度侧使用相同的配置文件来生成开发/生产网址?
Wcan

2
我喜欢在一个文件中提供多个配置的想法,但是开发配置和生产配置不能很好地混合使用:它们不应存储在同一文件中。您不想在开发机器上存储生产数据库密码,那太疯狂了!另外:切勿将此配置文件提交到版本控制。
jlh

@jlh完全正确-我永远不会在该文件中存储凭据-我要么使用dotenv要么通过外壳配置文件直接导出系统变量。
斯蒂芬·赖特

这种方法有一个问题,如果您使用的是webpack,它将将该配置文件捆绑到捆绑包中。因此,您不能替换不同环境的值。您必须为不同的环境创建不同的捆绑软件。
Neeraj Gulia

29

对于需要隐藏数据库凭据的运行玩具应用程序,请使用dotenv模块

将您的敏感信息放入.env文件(.gitignored)中,放在require('dotenv').config();您的应用中;dotenv在process.env其中创建您可以参考的条目。

.env 文件:

DATABASE_PASSWORD=mypw
DATABASE_NAME=some_db

要引用这些值:

process.env.DATABASE_PASSWORD

3

我确实放入了参数。就像许多node.js示例的端口一样。您很可能永远永远在pm2节点上运行您的应用程序。因此此变量不会作为源代码的一部分检入。而且它们也在全球范围内可用。

process.env.PORT
process.env.DATABASE_USER
process.env.DATABASE_PASSWORD


PORT=3000 DATABASE_HOST=localhost DATABASE_USER=admin DATABASE_PASSWORD=mypassword node app.js

export PORT=3000
export DATABASE_HOST=localhost
export DATABASE_PORT=27017
export DATABASE_USER=admin
export DATABASE_PASSWORD=mypassword
node app.js

var server = app.listen(process.env.PORT, function() {
});

var mongoClient = new MongoClient(new Server(process.env.DATABASE_HOST, process.env.DATABASE_PORT));

1
并且您有一些代码示例吗?我的意思是您确切地将其放在参数中?什么是参数?谢谢!
Aerodynamika

我猜这是环境变量吗?因此,我可以这样说:export PORT=3306
Nilton Vasques 2015年

1

要包含该配置,它是否像需要它的文件中的require('./ config.js')一样简单,还是有更好的方法呢?

这是存储配置文件的正确方法。

最好的方法是像普通的node.js模块一样编写整个应用程序,并编写一个小的启动文件来调用它。这个想法还允许您使用依赖注入来使用不同的数据库驱动程序。

好的,但不是完美的解决方案是环境。它在所有应用程序之间共享,因此,如果您要对所有应用程序使用某些数据,这是最好的选择。但是,如果您有一个特定应用程序的配置,则不是很多。

PS:而且请不要为此使用JSON。这是最糟糕的主意。:)


为什么JSON是个坏主意?
Aerodynamika 2014年

2
主要是因为它不支持注释和尾随逗号。在评论中解释太久了,但是在这里您可以找到一些“不要那样做”的例子。
Alex

1

考虑到不同的环境,我发现这是一种处理配置的好方法:

config.coffee

exports.setEnvironment = (env) ->
    switch env
        when "development"
            exports.DEBUG_LOG = true
            exports.DB_PORT = '27017'
            # ...
        when "testing"
            exports.DEBUG_ERROR = true
            exports.DEBUG_CLIENT = true
            # ...
        when "production"
            exports.DEBUG_LOG = false
            # ...
        else console.log "environment #{env} not found"

server.coffee:

config = require('./config')
config.setEnvironment env
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.