Oyuna biraz geç kaldım, ama burada ya da başka bir yerde ihtiyacım olanı bulamadım, bu yüzden kendime bir şey yazdım.
Bir yapılandırma mekanizması için gereksinimlerim şunlardır:
- Ön uç desteği. Kullanıcı arabirimi yapılandırmayı kullanamıyorsa bunun anlamı nedir?
- Destek
settings-overrides.js
- aynı görünüyor ancak adresindeki yapılandırmanın geçersiz kılınmasına izin veriyor settings.js
. Buradaki fikir, kodu değiştirmeden yapılandırmayı kolayca değiştirmektir. Saas için faydalı buluyorum.
Destekleyici ortamları daha az önemsememe rağmen - bunu çözümüme nasıl kolayca ekleyeceğimizi açıklayacağım
var publicConfiguration = {
"title" : "Hello World"
"demoAuthToken" : undefined,
"demoUserId" : undefined,
"errorEmail" : null // if null we will not send emails on errors.
};
var privateConfiguration = {
"port":9040,
"adminAuthToken":undefined,
"adminUserId":undefined
}
var meConf = null;
try{
meConf = require("../conf/dev/meConf");
}catch( e ) { console.log("meConf does not exist. ignoring.. ")}
var publicConfigurationInitialized = false;
var privateConfigurationInitialized = false;
function getPublicConfiguration(){
if (!publicConfigurationInitialized) {
publicConfigurationInitialized = true;
if (meConf != null) {
for (var i in publicConfiguration) {
if (meConf.hasOwnProperty(i)) {
publicConfiguration[i] = meConf[i];
}
}
}
}
return publicConfiguration;
}
function getPrivateConfiguration(){
if ( !privateConfigurationInitialized ) {
privateConfigurationInitialized = true;
var pubConf = getPublicConfiguration();
if ( pubConf != null ){
for ( var j in pubConf ){
privateConfiguration[j] = pubConf[j];
}
}
if ( meConf != null ){
for ( var i in meConf ){
privateConfiguration[i] = meConf[i];
}
}
}
return privateConfiguration;
}
exports.sendPublicConfiguration = function( req, res ){
var name = req.param("name") || "conf";
res.send( "window." + name + " = " + JSON.stringify(getPublicConfiguration()) + ";");
};
var prConf = getPrivateConfiguration();
if ( prConf != null ){
for ( var i in prConf ){
if ( prConf[i] === undefined ){
throw new Error("undefined configuration [" + i + "]");
}
exports[i] = prConf[i];
}
}
return exports;
açıklama
undefined
bu mülkün gerekli olduğu anlamına gelir
null
isteğe bağlı olduğu anlamına gelir
meConf
- şu anda kod, altındaki bir dosyayı hedefliyor app
. vcs tarafından yok sayılan meConf
, hedeflenen dosyaları geçersiz kılar conf/dev
.
publicConfiguration
- ön uçtan ve arka uçtan görülebilir.
privateConfiguration
- yalnızca arka uçtan görülebilir.
sendPublicConfiguration
- genel yapılandırmayı açığa çıkaracak ve genel bir değişkene atayacak bir rota. Örneğin, aşağıdaki kod genel yapılandırmayı ön uçta genel değişkenim myConf olarak gösterecektir. Varsayılan olarak genel değişken adını kullanır conf
.
app.get ("/ arka uç / conf", gerektirir ("conf"). sendPublicConfiguration);
Geçersiz kılma mantığı
- privateConfiguration, publicConfiguration ve ardından meConf ile birleştirilir.
- publicConfiguration, bir geçersiz kılma varsa her anahtarı denetler ve bu geçersiz kılmayı kullanır. Bu şekilde özel bir şey ortaya çıkarmıyoruz.
Çevre desteği ekleme
"Çevre desteği" ni yararlı bulmasam da, belki birisi bunu yapar.
Ortam desteği eklemek için, meConf Require deyimini böyle bir şeye değiştirmelisiniz (sözde kod)
if (çevre == "üretim") {meConf = zorunludur ("../ conf / dev / meConf"). üretim; }
if (çevre == "geliştirme") {meConf = gerektirir ("../ conf / dev / meConf"). geliştirme; }
Benzer şekilde, ortam başına bir dosyaya sahip olabilirsiniz
meConf.development.js
meConf.production.js
ve doğru olanı içe aktarın. Mantığın geri kalanı aynı kalır.