Quel serait le meilleur moyen de stocker DB config (nom d'utilisateur, mot de passe) dans une application open source qui s'exécute sur node.js/Express? Deux questions spécifiques:
Dois-je le mettre dans un fichier séparé config.js dans le dossier /lib
, Par exemple, et ne jamais l'inclure dans le référentiel maître qui est disponible publiquement sur GitHub?
Pour inclure la configuration, est-ce aussi simple que require('./config.js')
à partir du fichier qui en a besoin ou existe-t-il un meilleur moyen de le faire?
PS désolé si les questions semblent un peu simples ou pas si bien formulées, mais je commence tout juste :)
Je ne sais pas si c'est la meilleure pratique, mais personnellement, j'ai un config.json
fichier où je stocke mes informations de connexion à la base de données. Ensuite, je fais ce qui suit:
// options.js
var fs = require('fs'),
configPath = './config.json';
var parsed = JSON.parse(fs.readFileSync(configPath, 'UTF-8'));
exports.storageConfig= parsed;
Ensuite, à partir d'un fichier différent, je fais ce qui suit:
var options = require('./options');
var loginData = {
Host: options.storageConfig.Host,
user: options.storageConfig.user,
password: options.storageConfig.password
};
Voici comment je le fais:
Créez un fichier config.js contenant des objets représentant vos configurations:
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;
Puis dans mon index.js (ou ailleurs),
var env = process.env.NODE_ENV || 'development';
var config = require('./config')[env];
Traitez ensuite avec cet objet, par exemple.
var server = express();
server.listen(config.server.port);
...
Pour exécuter des applications de jouets où j'ai besoin de masquer les informations d'identification de la base de données, j'utilise le module dotenv .
Placez vos informations sensibles dans un fichier .env (qui est .gitignored), placez require('dotenv').config();
dans votre application; dotenv crée des entrées dans process.env
que vous pouvez consulter.
.env
fichier:
DATABASE_PASSWORD=mypw
DATABASE_NAME=some_db
Pour faire référence aux valeurs:
process.env.DATABASE_PASSWORD
Je mets des arguments. tout comme le port de nombreux exemples de node.js. probablement pour toujours, pm2, nodemon pour exécuter votre application. Cette variable ne fait donc pas partie de votre code source. et ils sont globalement disponibles aussi.
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));
Pour inclure la configuration, est-ce aussi simple que require ('./ config.js') dans le fichier qui en a besoin ou existe-t-il un meilleur moyen de le faire?
C'est la bonne façon de stocker des fichiers de configuration.
La meilleure approche consiste à écrire votre application entière comme un module node.js ordinaire et à écrire un petit fichier de démarrage qui l’appelle. Cette idée vous permet également d'utiliser différents pilotes de base de données à l'aide de l'injection de dépendance.
La solution est bonne, mais pas parfaite, c'est l'environnement. Il est partagé entre toutes les applications. Par conséquent, si vous souhaitez que certaines données soient accessibles à toutes, c'est le meilleur choix. Mais si vous avez une configuration pour une application particulière, pas beaucoup.
PS: Et s'il vous plaît, n'utilisez pas JSON pour cela. C'est la pire idée possible. :)
J'ai trouvé cela une bonne façon de gérer ma configuration, en tenant compte de différents environnements:
config.café
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"
serveur.café:
config = require('./config')
config.setEnvironment env