Najlepszy sposób na przechowywanie DB config w Node.Aplikacja js / Express

Jaki byłby najlepszy sposób przechowywania DB config (nazwa użytkownika, hasło) w aplikacji open source, która działa na node.js / Express? Dwa pytania szczegółowe:

  1. Czy Mogę umieścić go w osobnym config.na przykład plik js w folderze /lib i nigdy nie dołącza go do głównego repozytorium, które jest publicznie dostępne na Githubie?

  2. Aby wkomponować konfigurację, czy jest to tak proste jak require('./config.js') z pliku, który go potrzebuje, czy jest na to lepszy sposób?

PS przepraszam, jeśli pytania wydają się trochę proste lub nie tak dobrze sformułowane, ale dopiero zaczynam:)

Author: Blaszard, 2014-03-12

6 answers

Nie wiem, czy jest to najlepsza praktyka, ale osobiście mam plik config.json, w którym przechowuję informacje o połączeniu db. Następnie wykonuję następujące czynności:

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

Następnie z innego pliku wykonuję następujące czynności:

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

var loginData = {
        host: options.storageConfig.HOST,
        user: options.storageConfig.user,
        password: options.storageConfig.password
};
 16
Author: anvarik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 10:39:06

Oto Jak to robię:

Utwórz konfigurację.js, który zawiera obiekty reprezentujące Twoje configs:

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;

Potem w moim indeksie.js (lub gdziekolwiek naprawdę),

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

Następnie przetwarzaj z tym obiektem, np.

var server = express();
server.listen(config.server.port);
...
 71
Author: Stephen Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 21:39:49

Do uruchamiania aplikacji zabawkowych, w których muszę ukryć poświadczenia db, używam modułu dotenv.

Umieść swoje poufne informacje w .plik env (czyli .gitignored), umieść require('dotenv').config(); w swojej aplikacji; dotenv tworzy wpisy w process.env, do których możesz się odwoływać.

.env Plik:

DATABASE_PASSWORD=mypw
DATABASE_NAME=some_db

Aby odnieść się do wartości:

process.env.DATABASE_PASSWORD
 8
Author: Robb Broome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-05 18:28:54

Dodaję args. podobnie jak port wielu węzłów.przykład js. najprawdopodobniej na zawsze, pm2, nodemon uruchomić aplikację. więc ta zmienna nie jest częścią kodu źródłowego. są też dostępne na całym świecie.

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));
 3
Author: wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 16:29:18

Do inlcude config, jest to tak proste, jak wymaga ('./ config.js") z pliku, który go potrzebuje, czy jest na to lepszy sposób?

Jest to właściwy sposób przechowywania plików konfiguracyjnych.

Najlepszym podejściem byłoby napisanie całej aplikacji jak zwykłego węzła.moduł js i napisać mały plik startowy, który go wywoła. Ten pomysł pozwala również na używanie różnych sterowników baz danych za pomocą iniekcji zależności.

Dobre, ale nie idealne rozwiązanie jest środowisko. Jest współdzielony między wszystkimi aplikacjami, więc jeśli masz pewne dane, które chcesz być dostępne dla nich wszystkich, jest to najlepszy zakład. Ale jeśli masz config dla jednej konkretnej aplikacji, nie bardzo.

PS: i proszę, nie używaj do tego JSON. To najgorszy możliwy pomysł. :)

 1
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 22:54:36

Uznałem to za dobry sposób na obsługę mojego config, biorąc pod uwagę różne środowiska:

Config.kawa

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"

Serwer.kawa:

config = require('./config')
config.setEnvironment env
 1
Author: Flaudre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-01 09:08:28