Node.js dağıtım ayarları / yapılandırma dosyaları nasıl saklanır?


640

Birkaç Düğüm uygulaması üzerinde çalışıyorum ve dağıtımla ilgili ayarları depolamak için iyi bir model arıyordum. Django dünyasında (nereden geldiğim), ortak uygulama,settings.py , standart ayarları (saat dilimi, vb.) İçeren dosyaya ve sonra da local_settings.pydağıtım için belirli ayarlara, yani. hangi veritabanıyla konuşulacak, hangi memcache soketi, yöneticiler için e-posta adresi vb.

Düğüm için benzer desenler arıyordum. Sadece bir yapılandırma dosyası iyi olurdu, bu yüzden içindeki her şeyle sıkışmak zorunda değilsiniz app.js, ancak kaynak kontrolünde olmayan bir dosyada sunucuya özgü yapılandırmaya sahip olmanın bir yolunu buluyorum. Aynı uygulama, çılgınca farklı ayarlara sahip farklı sunucular arasında dağıtılabilir ve birleştirme çatışmalarıyla uğraşmak zorunda kalıyordu ve bu benim eğlenceli fikrim değil.

Peki bunun için bir tür çerçeve / araç var mı, yoksa herkes birlikte bir şeyleri kesmek mi?


gerçekten yapılandırmanın mean.js'de yapıldığı yolu seviyorum . temel olarak, uygulama ortamı başına farklı bir modele (üretim, geliştirme, test için) ve sırlar vb. gibi uygulama ortamı değişkenlerinden belirli ayrıntıları geçirerek uygulama ile ilgili yapılandırmayı ayrı bir modülde saklarlar.
Hinrich

Yanıtlar:


765

Bir kullanmak package.jsonbenim paketleri ve config.jsbenziyor benim yapılandırma için:

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

Yapılandırmayı projemden yüklüyorum:

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

ve sonra her şeye erişebiliyorum config.db_host,config.db_port vb ... Bu bana kaynak denetiminde şifreleri saklamak istemiyorsanız çevresel değişkenler saklanan ya kullanılması kodlanmış parametreleri veya parametreleri sağlar.

Ayrıca bir oluşturmak package.jsonve bir bağımlılıklar bölümü eklemek:

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

Projeyi yerel makineme klonladığımda npm installpaketleri kurmak için koşuyorum . Burada daha fazla bilgi .

Proje GitHub'da depolanıyor ve üretim sunucum için uzaktan kumandalar ekleniyor.


32
dev ve prod için farklı yapılandırma ayarlarınız olduğunda ne olur?
chovy

4
Ben yapmadım ama bunu yapmanın bir yolu var .. her env için env adını bir ENV değişkeninde ayarlayın. Sonra bu dosyada, sadece javascript .. uygun değişkenleri seçici yüklemek için bir vaka veya if deyimi kullanın. Hatta her env için ayrı bir yapılandırma alt dosyası yapabilir ve if deyiminde, alt dosyayı buraya bir subconfig değişkenine yeniden yükleyebilir ve bu alt yapılandırma ana yapılandırmaya aktarabilirsiniz .. Temelde söylemeye çalıştığım js, böylece yaratıcı olabilir
noli

4
hangi süreç.env? nerede bulur? Ve nasıl ayarlanır?
kızgın kivi

12
Ben "vay .. birkaç saat için node.js bakıyorum ve benim app zaten çalışıyor .. düşünüyordum .. btw, belki ben geldi bu rastgele kod biraz paylaşacağım"
noli

3
Bu geçiş sözcüklerini saklamak için hala ortam değişkenlerini kullanamıyor musunuz? Bu satırın amacı bu değil: config.twitter.password = process.env.TWITTER_PASSWORD || 'parola';
DMart

244

Düğüm v0.5.x'ten itibaren JSON dosyalarına gereksinim duyabilirsiniz ( bu cevaba referans olarak )

config.json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);

40
Bu özellikten çok etkilenmedim. ("./ config.js") gerektirebilir ve çok önemli olduğunu düşündüğüm yapılandırma dosyalarına, diğer çanlar ve ıslıklara yorum ekleme olanağına sahip olursunuz. Eğer config sadece özellikler ve hiçbir kod gerektirmez hiçbir şey gevşek (config.js) sizinle JSON
export.config

3
@teknopaul haklısın, ama bana söyleyen aptal ve akıllı şablonlama sistemlerini kullanmanın 'doğruluğu' / kullanılabilirliği hakkında büyük bir tartışma vardı: (2) sadece templasyon (veya yapılandırma) yapmak için "neredeyse PL" yi yeniden yapılandırmak kötü bir fikirdir - mevcut gerçek PL'nizi bilinen davranışlarla yeniden kullanmak için daha iyi. şimdiye kadar +1 kullanıcı ayarlarını yapmak için JS geri dönüşüm için; Bildirge yaklaşımına gitmediği için -1. bildirim yolunda oldukça karmaşık yapılandırma şeyleri gördük; bağırsaklarım bana bunun yolun olduğunu söylüyor.
akış

1
VScode'daki json dosyalarındaki nesneler hakkında fikir sahibi olma (2017 sonu). Module.exports sitesindeki nesneler için tam olarak çalışan akıllılık.
Romain Vincent

199

Daha sonra, yapılandırmayı yönetmek için oldukça iyi bir Node.js modülü buldum: nconf .

Basit bir örnek:

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

Ayrıca ayarların Redis'te depolanmasını destekler , yapılandırma dosyaları yazar ve oldukça sağlam bir API'ye sahiptir ve ayrıca Flatiron çerçeve girişiminin bir parçası olarak daha saygın Node.js mağazalarından biri olan Nodejitsu tarafından desteklenmektedir , bu yüzden oldukça geleceğe dönük.

Check out Github at nconf .


2
Belki aptalca bir soru ama net bir açıklama görmedim: Düğüm ortamı değişkenlerini nerede ayarlayabilirim? Zaten nconf kullanıyorum ama çevresel değişkenleri nereye koyacağım belli değil. Nginx / apache'de mi? Başka bir yapılandırma dosyası mı?
Sivil

91
Yorumlara izin verilmediğinden, yapılandırma olarak .json dosyasını kullanmanın iyi bir fikir olduğunu düşünmüyorum.
Frank Xu

11
Harika görünüyor. Yapılandırma dosyası komut satırı seçeneklerini ve ortam değişkenlerini geçersiz kılarsa, Unixhead'lerin çoğunu şaşırtacağınızı düşünüyorum. Aşağıdaki artan önceliğe alışkınız: yapılandırma dosyaları, ortam değişkenleri, komut satırı seçenekleri.
sheldonh

2
@sheldonh Boolean seçeneklerinin her zaman argv'de ayarlandığını öğrenene kadar bekleyin , bu nedenle önceliği kırın ...: /
Daniel C. Sobral

@ DanielC.Sobral Gerçek bir utanç. Oh, ve LTNS! :-)
sheldonh

94

Benim çözümüm oldukça basit:

Ortam yapılandırmasını ./config/index.js dosyasına yükleyin

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

./Config/config.global.js'de bazı varsayılanlar tanımlayın

var config = module.exports = {};

config.env = 'development';
config.hostname = 'dev.example.com';

//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';

./Config/config.test.js içindeki varsayılan değerleri geçersiz kılın

var config = require('./config.global');

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

./Models/user.js dosyasında kullanma:

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

Uygulamanızı test ortamında çalıştırma:

NODE_ENV=test node ./app.js

2
Bunu tercih ederim. Başkaları tarafından belirtildiği gibi JSON tercih edilen bir depolama yapısı değildir ve küresellerle olan bu katman basit ve etkilidir
Sebastian J.

Bunu nconf yerine tercih etmenin tek nedeni, yapılandırma (dev, test ve prod) dosyaları için .js formatına izin vermesidir. JSON biçiminde mümkün olmayan her yapılandırma seçeneğini belgelememize olanak tanır.
Kunal Kapadia

BTW, NODE_ENVvarsayılan olarak 'geliştirme'. Bunun yerine 'üretim'i kontrol etmelisiniz.
Kevin Suttle

5
Gelişimi kontrol etmiyorum. Ben temerrüde düşüyorum. Üretime niye temerrüde düşmeyeceğimi bilmiyorum
chovy

39

On iki faktörlü bir uygulamanın ilkelerini izleyen dotenv'e de bakabilirsiniz .

Düğüm-config kullanıyordum, ama bu nedenle dotenv oluşturdum. Ruby'nin dotenv kütüphanesinden tamamen ilham aldı.

Kullanımı oldukça kolaydır:

var dotenv = require('dotenv');
dotenv.load();

Sonra sadece bir .env dosyası oluşturun ve ayarlarınızı buraya yerleştirin:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

Yani en dotenv nodejs için.


2
Ya da bunu sadece foreman run node xx.js.env dosyanızda otomatik olarak okuyacaktır.
Simon

1
bu yaklaşımı üretim için de kullanabilir miyim?
Lamour

1
@lamar no, onları gerçek sunucudaki env değişkenlerine ayarlarsınız. Her konuşlandırışınızda kaynak kodda bulunmuyorlardı.
sidonaldson

@Lamar evet aslında, env değişkenlerini sunucuda ayarlamaya daha taşınabilir bir alternatif olarak yapabilirsiniz. Önemli olan , dosyayı sürüm denetiminize veya dağıtım işleminize dahil etmemenizdir.env .
Josh Noe

31

Komut dosyalarınızı başlatmak için npm kullanıyor musunuz (env vb)?

.envDosyaları kullanırsanız, dosyalarınıza dahil edebilir package.json ve kaynak / başlatmak için npm kullanabilirsiniz.

Misal:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

sonra npm komut dosyalarını çalıştırın:

$ npm start-dev

Burada açıklanan https://gist.github.com/ericelliott/4152984 Eric Elliot'a verilen tüm kredi


2
"Kaynak" ın ne olduğunu açıklayabilir misiniz? Ben olsunsource : not found
JohnnyBizzle

@JohnnyBizzle source(veya basitçe .), geçerli kabuktaki belirli bir dosyadan komutları okumak ve yürütmek için Unix kabuklarında (Bash vb.) Yerleşik bir komuttur . Yani, komutlar bir alt kabukta yürütülmez. Bu örnekte bunun etkisi, tanımlanan ortam değişkenlerinin prod.envgeçerli kabuğa eklenmesi ve dolayısıyla bu kabuğun ortaya çıkardığı herhangi bir alt sürece aktarılmasıdır. Windows CMD kullanıyor gibi görünüyorsunuz. Daha fazla ayrıntı için bu soruya bakın.
Utku

Worth belirterek - 12 faktör uygulaması önerir değil yaratma dev.envve prod.envancak tek sahip .envdağıtmak başına dosyayı.
Iiridayn

24

$ HOST ve $ NODE_ENV değişkenine (biraz RoR gibi) bağlı olarak yapılandırma dosyasını yükleyen düğüm yapılandırmasına da bakabilirsiniz : belgeler .

Bu, farklı dağıtım ayarlarında (oldukça yararlı olabilir development, testya da production).


22

Sadece bir basit yapmak settings.jsile exports:

exports.my_password = 'value'

Ardından, komut dosyanızda requireşunları yapın:

var settings = require('./settings.js');

Artık tüm ayarlarınız settingsdeğişken üzerinden sağlanacaktır :

settings.my_password // 'value'

@backdesk elbette, sırları şifreleyecek ve ip, bazı belirteçler, vb. kullanarak erişimi sınırlandıracak gizli bir depolama sistemi kurabilirdiniz. değil.
Vanuan

@backdesk Örnekle ilgili bir sorun yok. Bu sadece: somut bir şeyi açıklamak için bir örnek.
Emilio Grisolía

14

Şapkamı burada yüzüğe atacağım çünkü bu cevapların hiçbiri herhangi bir sistemin ihtiyaç duyduğu tüm kritik bileşenlere hitap etmiyor. hususlar:

  • Genel yapılandırma (ön uç tarafından görülebilir) ve özel yapılandırma (guy mograbi bunu doğru yaptı). Ve bunların ayrı tutulmasını sağlamak.
  • Anahtarlar gibi sırlar
  • Varsayılanlar ve çevreye özgü geçersiz kılmalar
  • Ön uç paketleri

Yapılandırmamı şu şekilde yapıyorum:

  • config.default.private.js - Sürüm kontrolünde, bunlar yalnızca arka uç tarafından görülebilen varsayılan yapılandırma seçenekleridir.
  • config.default.public.js- Sürüm kontrolünde, bunlar arka uç ve ön uç tarafından görülebilen varsayılan yapılandırma seçenekleridir
  • config.dev.private.js - Dev için farklı özel varsayılanlara ihtiyacınız varsa.
  • config.dev.public.js - Geliştirme için farklı genel varsayılanlara ihtiyacınız varsa.
  • config.private.js - Sürüm kontrolünde değil, bunlar geçersiz kılan ortama özgü seçenekler config.default.private.js
  • config.public.js - Sürüm kontrolünde değil, bunlar geçersiz kılan ortama özgü seçenekler config.default.public.js
  • keys/- Her dosyanın bir tür farklı bir sır sakladığı klasör. Bu aynı zamanda sürüm kontrolü altında değildir (anahtarlar asla sürüm kontrolü altında olmamalıdır).

Ben javascript dilinin tam gücüne sahip olmak için yapılandırma için düz eski javascript dosyaları kullanın (yorumlar ve daha sonra geçersiz kılınabilmesi için çevreye özgü dosyaya varsayılan yapılandırma dosyasını yüklemek gibi şeyler yapma yeteneği dahil). Ortam değişkenlerini kullanmak istiyorsanız, bu yapılandırma dosyalarının içine yükleyebilirsiniz (env değişkenlerini kullanmamaya karşı öneriyorum. Aynı sebepten dolayı json dosyalarını kullanmanızı önermiyorum - inşa etmek için bir programlama dilinin gücü yok yapılandırma).

Her anahtarın ayrı bir dosyada olmasının nedeni yükleyici kullanımı içindir. Bu, makinede anahtarlar oluşturan ve anahtarlar klasöründe saklayan bir yükleyiciye sahip olmanızı sağlar. Bu olmadan, anahtarlarınıza erişemeyen yapılandırma dosyanızı yüklediğinizde yükleyiciniz başarısız olabilir. Bu şekilde, kodunuzun belirli bir sürümünde var olan ve olmayanlar hakkında endişelenmenize gerek kalmadan dizinde gezinebilir ve o klasördeki tüm anahtar dosyalarını yükleyebilirsiniz.

Muhtemelen özel yapılandırmada yüklü anahtarları olduğundan, kesinlikle herhangi önyüz kodunda özel yapılandırma yüklemek istemiyoruz. Ön uç kod tabanınızı arka ucunuzdan tamamen ayırmak muhtemelen daha ideal olsa da, çoğu zaman PITA, insanların bunu yapmasını önlemek için yeterince büyük bir engeldir, bu nedenle özel ve genel yapılandırma. Ancak özel yapılandırmanın ön uçta yüklenmesini önlemek için iki şey yapıyorum:

  1. Ön uç paketlerimin özel yapılandırmada sahip olduğum gizli anahtarlardan birini içermemesini sağlayan bir birim testim var.
  2. Ön uç kodumu arka uç kodumdan farklı bir klasörde var ve "config.js" adlı iki farklı dosyam var - her bir uç için bir tane. Arka uç için config.js özel yapılandırmayı, ön uç için genel yapılandırmayı yükler. O zaman her zaman sadece ('config') gerekir ve nereden geldiğini düşünmeyin.

Son bir şey: yapılandırmanız tarayıcıya diğer ön uç kodlarınızdan herhangi birinden tamamen ayrı bir dosya aracılığıyla yüklenmelidir . Ön uç kodunuzu bir araya getirirseniz, genel yapılandırma tamamen ayrı bir paket olarak oluşturulmalıdır. Aksi halde, yapılandırmanız artık gerçekte yapılandırılmış değildir - kodunuzun sadece bir parçasıdır. Config'in farklı makinelerde farklı olabilmesi gerekir.


13

Hükümlü , doğrulama için bir şema ekleyen başka bir seçenektir. Nconf gibi, ortam değişkenleri, bağımsız değişkenler, dosyalar ve json nesnelerinin herhangi bir kombinasyonundan yükleme ayarlarını destekler.

README'den bir örnek:

var convict = require('convict');
var conf = convict({
  env: {
    doc: "The applicaton environment.",
    format: ["production", "development", "test"],
    default: "development",
    env: "NODE_ENV"
  },
  ip: {
    doc: "The IP address to bind.",
    format: "ipaddress",
    default: "127.0.0.1",
    env: "IP_ADDRESS",
  },
  port: {
    doc: "The port to bind.",
    format: "port",
    default: 0,
    env: "PORT"
  }
});

Başlangıç ​​makalesi: Düğüm hükümlü ile Yapılandırmaları Taming


12

Konfig'yi ortama özgü yapılandırma dosyaları için kullanabilirsiniz . Json veya yaml yapılandırma dosyalarını otomatik olarak yükler, varsayılan değer ve dinamik yapılandırma özelliklerine sahiptir.

Konfig deposundan bir örnek:

File: config/app.json
----------------------------
{
    "default": {
        "port": 3000,
        "cache_assets": true,
        "secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
    },

    "development": {
        "cache_assets": false
    },

    "test": {
        "port": 3001
    },

    "staging": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    },

    "production": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    }
}

Geliştirilmekte:

> config.app.port
3000

Üretimde, $ NODE_ENV=production PORT=4567 node app.js

> config.app.port
4567

Daha fazla detay: https://github.com/vngrs/konfig


9

Yapılandırma olarak bir dosya adlandırması olarak bir klasör oluşturacağım config.jsve daha sonra bu dosyayı aşağıdaki gibi gerekli yerlerde kullanacağım

Config.js örneği

module.exports = {
    proxyURL: 'http://url:port',
    TWITTER: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    GOOGLE: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    FACEBOOK: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    }
}

Sonra bu yapılandırma dosyasını bir yerde kullanmak istersem

İlk önce aşağıdaki gibi içe aktarım

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

ve değerlere aşağıdaki gibi erişebilirim

const oauth = OAuth({
    consumer: {
        key: config.TWITTER.consumerkey,
        secret: config.TWITTER.consumerSecrete
    },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
        return crypto.createHmac('sha1', key).update(base_string).digest('base64');
    }
});

6

Sadece npmmodülü kullanın config(300000'den fazla indirme)

https://www.npmjs.com/package/config

Node-config, uygulama dağıtımlarınız için hiyerarşik yapılandırmaları düzenler.

Bir dizi varsayılan parametre tanımlamanıza ve bunları farklı dağıtım ortamları (geliştirme, qa, evreleme, üretim vb.) İçin genişletmenize olanak tanır.

$ npm install config
$ mkdir config
$ vi config/default.json


{
      // Customer module configs
      "Customer": {
        "dbConfig": {
          "host": "localhost",
          "port": 5984,
          "dbName": "customers"
        },
        "credit": {
          "initialLimit": 100,
          // Set low for development
          "initialDays": 1
        }
      }
}



$ vi config/production.json

{
  "Customer": {
    "dbConfig": {
      "host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}



$ vi index.js

var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);

if (config.has('optionalFeature.detail')) {
  var detail = config.get('optionalFeature.detail');
  //...
}


$ export NODE_ENV=production
$ node index.js

4

'Geliştirme' ve 'üretim' yapılandırmalarını ayırmak daha iyidir .

Aşağıdaki yolu kullanıyorum: İşte benim config / index.js dosya:

const config = {
    dev : {
        ip_address : '0.0.0.0',
        port : 8080,
        mongo :{
            url : "mongodb://localhost:27017/story_box_dev",
            options : ""
        }
    },
    prod : {
        ip_address : '0.0.0.0',
        port : 3000,
        mongo :{
            url : "mongodb://localhost:27017/story_box_prod",
            options : ""
        }
    }
} 

Yapılandırma gerektiren için aşağıdakileri kullanın:

const config = require('../config')[process.env.NODE_ENV];

Daha sonra yapılandırma nesnenizi kullanabilirsiniz:

const ip_address = config.ip_address;
const port = config.port;

Ayrıca dosyanın module.exports = config;sonunda kullanıcı olabilirconfig/index.js
mapmalith

3

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:

  1. Ön uç desteği. Kullanıcı arabirimi yapılandırmayı kullanamıyorsa bunun anlamı nedir?
  2. 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.


undefinedgerçekten 'zorunlu' ve null'isteğe bağlı' anlamına geldiği çok açık değil . yani sarı çöp kutusu plastik ve mavisi hurda kağıt için mi? iyi, ama o çöp atmadan önce kılavuzu okumak zorunda kaldı.
akış

Bu sözleşmeyi kullanmak zorunda değilsiniz. Yararlı buluyorum ve ekibime kullanmasını söylüyorum, ancak bu özelliği açıkça kaldırabilirsiniz.
guy mograbi

3

Sadece kullandığım alt bir örnek çünkü tipik bir .json dosyasından daha fazla esneklik istedim ama bağımlılık gerektiren bir kütüphaneye çekilmesini istemedim böyle bir şey. Temel olarak, ayarlamak istediğim değerlere sahip bir nesneyi döndüren bir işlevi derhal çağırdı. Çok esneklik sağlar.

     module.exports = function(){
       switch(node_env){
         case 'dev':
           return
           { var1 = 'development'};
         }
    }();

Burada tam örnekle çok daha iyi bir açıklama var. Node.js'de Config Dosyalarını Kullanma


3

Bunun gerçekten eski bir yazı olduğunu biliyorum. Ancak ortam değişkenlerini yapılandırmak için modülümü paylaşmak istiyorum, bence çok esnek bir çözüm. İşte modül json-yapılandırıcı

var configJson = {
  'baseUrl': 'http://test.com',
  '$prod_baseUrl': 'https://prod.com',
  'endpoints': {
    'users': '<%= baseUrl %>/users',
    'accounts': '<%= baseUrl %>/accounts'
    },
  foo: 'bar',
  foobar: 'foobar',
  $prod_foo: 'foo in prod',
  $test_foo: 'foo in test',
  deep:{
    veryDeep: {
      publicKey: 'abc',
      secret: 'secret',
      $prod_secret: 'super secret'
    }
  }
};

var config = require('json-configurator')(configJson, 'prod');

console.log(config.deep.veryDeep.secret) 
// super secret 

console.log(config.endpoints.users)
// https://prod.com/users 

Sonra process.env.NODE_ENVortamınız için tüm değişkenleri almak için kullanabilirsiniz .


2

Ek olarak nconf modülünde belirtilen bu cevap ve düğüm-yapılandırmasına belirtilen bu cevap , de vardır düğüm-iniparser ve IniReader basit .ini yapılandırma dosyası ayrıştırıcıları gibi görünen.


win-ini dosyalarına geri dönmenin bir yolu yok ... bu iniparser, yapılandırmadaki bölümleri nasıl ayrıştırılacağını bildiklerini gururla vurgulamaktadır ... 2013'te ... daha derin yuvalamaya ihtiyacınız varsa [foo/bar]? [foo\bar]? bar.baz=42? bar/baz=42? bar\baz=42? bar:baz=42? nasıl 42bir sayı olduğunu nasıl söylersin ? tüm basamaklı bir metin olabilir! --tos XML, YAML'yi at, WIN.INI'yi at, JSON'u kucakla, endişeler gitti.
akış



1

İşte bu makaleden esinlenilmiş düzgün bir yaklaşım . Her yerde bulunan lodash paketi dışında herhangi bir ek paket gerektirmez . Ayrıca, yuvaya özgü varsayılanları ortama özgü üzerine yazma işlemleriyle yönetmenizi sağlar.

İlk olarak, paket kök yolunda şöyle görünen bir yapılandırma klasörü oluşturun

package
  |_config
      |_ index.js
      |_ defaults.json
      |_ development.json
      |_ test.json
      |_ production.json

İşte index.js dosyası

const _ = require("lodash");
const defaults = require("./defaults.json");
const envConf = require("./" + (process.env.NODE_ENV || "development") + ".json" );
module.exports = _.defaultsDeep(envConf, defaults);

Şimdi bir varsayılanımız olduğunu varsayalım.

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value3",
    "confKey4": "value4"
  }
}

ve development.json böyle

{
  "confKey2": {
    "confKey3": "value10",
  }
}

bunu yaparsanız config = require('./config')burada alırsınız budur

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value10",
    "confKey4": "value4"
  }
}

Ortama özgü dosyalarda tanımlananlar dışındaki tüm varsayılan değerleri aldığınıza dikkat edin. Böylece bir yapılandırma hiyerarşisini yönetebilirsiniz. Kullanmak defaultsDeepiç içe geçmiş varsayılanlara bile sahip olmanızı sağlar.



0

Burada önerilen çözümlerden bazılarını denedim, ancak onlardan memnun kalmadım, bu yüzden kendi modülümü oluşturdum. Denirmikro-config ve ana fark, konfigürasyon üzerinde konvansiyonu onurlandırmasıdır, böylece sadece modüle ihtiyaç duyabilir ve kullanmaya başlayabilirsiniz.

Yapılandırmanızı düz js veya /configklasördeki json dosyalarında depolarsınız . Önce default.jsdosyayı, sonra /configdizindeki diğer tüm dosyaları , daha sonra$NODE_ENV değişkene .

Ayrıca, yerel yapılandırmayla local.jsveya ortama özgü yerel yapılandırma için bu yapılandırmanın geçersiz kılınmasına izin verir/config/env/$NODE_ENV.local.js .

Buradan bakabilirsiniz:

https://www.npmjs.com/package/mikro-config

https://github.com/B4nan/mikro-config


0

Uzun zamandır, buradaki çözümde bahsedilen yaklaşımı kullanırdım. Bununla birlikte, açık metinlerde sırların güvenliği ile ilgili bir endişe vardır. configGüvenlik bitlerinin üstesinden gelmek için üstte başka bir paket kullanabilirsiniz .

Şuna bir göz atın: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/


Bu hizmet için ödeme yapmak için neden Azure'a abone olmalıyım? Neden ansible tonoz kullanmıyorsunuz? Başka bir şey: Bence kimse kaynak depoda açık metin kimlik bilgilerine sahip bir yapılandırma dosyası yayınlamayacaktır. Ortam değişkenlerini kullanın veya gizli verilerinizi salt okunur izinli bir dosyaya yerleştirin.
Yasser Sinjab

Bazı üçüncü taraf konumlarından okuyabilir ve kodunu çözebilir ve hizmetinizin bu gizli verileri kullanmasını sağlayabilirseniz, bir bilgisayar korsanının bilgisayarınıza erişmeleri durumunda tam olarak aynı şeyi yapması mümkün olacaktır. Daha fazla iş (daha uzun sürer) ama sonunda sizi korumaz. Sunucunuza nüfuz ederse, üzerinde bulunan herhangi bir şeyin artık herkese açık olduğunu hayal edin.
Alexis Wilke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.