Node.js, everyauth ile kullanılacak ortama özgü yapılandırmaları ayarlar


117

Node.js + express.js + everyauth.js kullanıyorum. Tüm Everyauth mantığımı bir modül dosyasına taşıdım

var login = require('./lib/everyauthLogin');

bunun içinde oAuth yapılandırma dosyamı anahtar / gizli kombinasyonlarla yüklüyorum:

var conf = require('./conf');
.....
twitter: {
    consumerKey: 'ABC', 
    consumerSecret: '123'
}

Bu kodlar farklı ortamlar için farklıdır - geri aramalar farklı url'ler için olduğundan geliştirme / hazırlama / üretim.

Qu. Bunları çevresel yapılandırmada tüm modülleri filtrelemek için nasıl ayarlayabilirim yoksa yolu doğrudan modüle iletebilir miyim?

Env içinde ayarla:

app.configure('development', function(){
  app.set('configPath', './confLocal');
});

app.configure('production', function(){
  app.set('configPath', './confProduction');
});

var conf = require(app.get('configPath'));

Geçmek

app.configure('production', function(){
  var login = require('./lib/everyauthLogin', {configPath: './confProduction'});
});

? umarım mantıklıdır


Aşağıdaki fikirlerden bazılarını kullanan bir çözüm buldum, bir nesne yerine module = function'a sahip olarak process.env.NODE_ENV'yi değerlendirebilir ve ortam için doğru nesneyi döndürebilirim. Biraz dağınık ama işe yarıyor.
andy t

Utanmaz kendi kendine tanıtımı affedin, ancak node.js için bunu ayrı dosyalar ve bir komut satırı anahtarı aracılığıyla yapacak bir modül yazdım: node-configure
Randolpho

Yanıtlar:


192

Çözümüm,

uygulamayı kullanarak yükle

NODE_ENV=production node app.js

Ardından config.jsbir nesne yerine işlev olarak ayarlayın

module.exports = function(){
    switch(process.env.NODE_ENV){
        case 'development':
            return {dev setting};

        case 'production':
            return {prod settings};

        default:
            return {error or other settings};
    }
};

Sonra Jans çözümüne göre dosyayı yükleyin ve gerekirse bir değer iletebileceğimiz yeni bir örnek oluşturun, bu durumda process.env.NODE_ENVglobaldir, dolayısıyla gerekli değildir.

var Config = require('./conf'),
    conf = new Config();

Ardından, yapılandırma nesnesi özelliklerine tam olarak eskisi gibi erişebiliriz

conf.twitter.consumerKey

2
Neden burada yeniyi kullanıyorsunuz?
bluehallu

5
Ben @ bluehallu. Mı newgerekli?
Sung Cho

2
Windows'taki eşdeğeri SET NODE_ENV = geliştirme olacaktır
mujaffars

3
Yapmak yerine new. Aşağıdakileri yapıyorum config.js....Config = function(){...}; module.exports = Config()
Atu

Ya 50 web sunucum varsa, bu durumda komut dosyasını manuel olarak başlatmak için her sunucuya gitmek zor olacak
Rajesh

60

Üst düzey NODE_ENV olan bir JSON dosyanız da olabilir. IMO, bu, yapılandırma ayarlarını ifade etmenin daha iyi bir yoludur (ayarları döndüren bir komut dosyası kullanmak yerine).

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

Env.json için örnek:

{
    "development": {
        "MONGO_URI": "mongodb://localhost/test",
        "MONGO_OPTIONS": { "db": { "safe": true } }
    },
    "production": {
        "MONGO_URI": "mongodb://localhost/production",
        "MONGO_OPTIONS": { "db": { "safe": true } }
    }
}

Merhaba, neden yapılandırma ayarlarını ifade etmek için daha iyi bir yol olduğunu düşündüğünüzü açıklayabilir misiniz (ayarları döndüren bir komut dosyası kullanmak yerine). ?
Venkat Kotra

14
Sanırım çok fazla fark yaratmıyor. Zihinsel olarak, JSON'u gördüğümde 'statik veri' ile bir JS dosyası gördüğümde düşünüyorum, içinde biraz mantık olduğunu düşünüyorum. Ayrıca, .json türünü kullanmanın bir başka yararı, diğer dillerin aynı dosyayı içe aktarabilmesidir.
mattwad

1
@VenkatKotra yapılandırması genellikle statik olarak kabul edilir ve bu nedenle en iyi json, yaml, ini, vb. Gibi şeylerle bildirimsel olarak ifade edilir. Bu durumu veren bir komut dosyasıyla zorunlu olarak yapıldı, sortof, dinamik bir şeyin gerçekleştiğini ima eder , bu da kötü olur.
en fazla

9
Bu yöntemin kaynak denetiminde kimlik bilgilerini ortaya çıkardığını unutmayın.
Pier-Luc Gendreau

sahneleme ve prodüksiyon için farklı url yapabilir miyim?
Alex

35

Yapılandırma modülünü kullanmak çok kullanışlı bir çözümdür .

modülü kurduktan sonra:

$ npm install config

Bir default.json oluşturabilirsiniz yapılandırma dosyası . (.json5 uzantısını kullanarak JSON veya JS nesnesini kullanabilirsiniz)

Örneğin

$ vi config/default.json

{
  "name": "My App Name",
  "configPath": "/my/default/path",
  "port": 3000
}

Bu varsayılan yapılandırma, ortam yapılandırma dosyası veya yerel bir geliştirme ortamı için yerel bir yapılandırma dosyası tarafından geçersiz kılınabilir:

production.json şunlar olabilir:

{
  "configPath": "/my/production/path",
  "port": 8080
}

development.json şöyle olabilir:

{
  "configPath": "/my/development/path",
  "port": 8081
}

Yerel PC'nizde tüm ortamı geçersiz kılan bir local.json olabilir veya local-production.json veya local-development.json olarak belirli bir yerel konfigürasyona sahip olabilirsiniz. .

Yükleme sırasının tam listesi .

Uygulamanızın İçinde

Uygulamanızda yalnızca yapılandırmaya ve gerekli özniteliğe ihtiyacınız vardır.

var conf = require('config'); // it loads the right file
var login = require('./lib/everyauthLogin', {configPath: conf.get('configPath'));

Uygulamayı yükleyin

uygulamayı kullanarak yükleyin:

NODE_ENV=production node app.js

veya sonsuza kadar veya pm2 ile doğru ortamı ayarlama

Sonsuza dek:

NODE_ENV=production forever [flags] start app.js [app_flags]

PM2 (kabuk aracılığıyla):

export NODE_ENV=staging
pm2 start app.js

PM2 (.json aracılığıyla):

process.json

{
   "apps" : [{
    "name": "My App",
    "script": "worker.js",
    "env": {
      "NODE_ENV": "development",
    },
    "env_production" : {
       "NODE_ENV": "production"
    }
  }]
}

Ve sonra

$ pm2 start process.json --env production

Bu çözüm çok temizdir ve Üretim / Hazırlama / Geliştirme ortamı ve yerel ayarlar için de farklı yapılandırma dosyaları ayarlamayı kolaylaştırır.


npm install config --save, daha iyi değil mi?
stackdave

15

Kısaca

Bu tür bir kurulum basit ve zariftir:

env.json

{
  "development": {
      "facebook_app_id": "facebook_dummy_dev_app_id",
      "facebook_app_secret": "facebook_dummy_dev_app_secret",
  }, 
  "production": {
      "facebook_app_id": "facebook_dummy_prod_app_id",
      "facebook_app_secret": "facebook_dummy_prod_app_secret",
  }
}

common.js

var env = require('env.json');

exports.config = function() {
  var node_env = process.env.NODE_ENV || 'development';
  return env[node_env];
};

app.js

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

var facebook_app_id = config.facebook_app_id;
// do something with facebook_app_id

Üretim modunda çalıştırmak için: $ NODE_ENV=production node app.js


Detayda

Bu çözüm şu adrestedir : http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/ , kontrol edin daha fazla detay.


5

Bunu yapma şeklimiz, uygulamayı ortamla başlatırken bir argüman iletmektir. Örneğin:

node app.js -c dev

App.js'de daha sonra dev.jsyapılandırma dosyamız olarak yükleriz . Bu seçenekleri optparse-js ile ayrıştırabilirsiniz .

Artık bu yapılandırma dosyasına bağlı olan bazı temel modülleriniz var. Bunları böyle yazdığınızda:

var Workspace = module.exports = function(config) {
    if (config) {
         // do something;
    }
}

(function () {
    this.methodOnWorkspace = function () {

    };
}).call(Workspace.prototype);

Ve sonra şu şekilde arayabilirsin app.js:

var Workspace = require("workspace");
this.workspace = new Workspace(config);

Tüm mantığı app.js app.configure('developmentkodunun içinde tutmayı tercih ederim , ancak bu çözümü bununla kullanıp kullanamayacağımı görmek için bir göz atacağım
andy t

Bu yanıtı güncelleyin: Architect , bunu daha güzel bir şekilde çözen bir bağımlılık yönetimi çerçevesidir.
Jan Jongboom

5

.envÜretim ayarlarını yerel olarak geçersiz kılmak için dosyayı kullanmak zarif bir yöntemdir . Komut satırı anahtarlarına gerek yok. Bir config.jsondosyadaki tüm bu virgül ve parantezlere gerek yok . Cevabımı burada görün

Örnek: benim makinemde .envdosya şu:

NODE_ENV=dev
TWITTER_AUTH_TOKEN=something-needed-for-api-calls

Yerel .envbilgim tüm ortam değişkenlerini geçersiz kılar. Ancak hazırlık veya üretim sunucularında (belki heroku.com'dalar), ortam değişkenleri aşamaya NODE_ENV=stageveya üretime önceden ayarlanmıştır NODE_ENV=prod.


4

dağıtım sunucusunda ortam değişkenini ayarlayın (örn: NODE_ENV = üretim gibi). Çevresel değişkeninize process.env.NODE_ENV üzerinden erişebilirsiniz. Genel ayarlar için aşağıdaki yapılandırma dosyasını bulun

const env = process.env.NODE_ENV || "development"

const configs = {
    base: {
        env,
        host: '0.0.0.0',
        port: 3000,
        dbPort: 3306,
        secret: "secretKey for sessions",
        dialect: 'mysql',
        issuer : 'Mysoft corp',
        subject : 'some@user.com',
    },
    development: {
        port: 3000,
        dbUser: 'root',
        dbPassword: 'root',

    },
    smoke: {
        port: 3000,
        dbUser: 'root',
    },
    integration: {
        port: 3000,
        dbUser: 'root',
    },
    production: {
        port: 3000,
        dbUser: 'root',
    }
};

const config = Object.assign(configs.base, configs[env]);

module.exports= config;

base, tüm ortamlar için ortak yapılandırmayı içerir.

sonra diğer modülleri içe aktarın

const config =  require('path/to/config.js')
console.log(config.port)

Mutlu Kodlama ...


3

Bunu nodejs-config modülü ile çok daha şık bir şekilde yapmaya ne dersiniz ?

Bu modül, bilgisayarınızın adına göre yapılandırma ortamını ayarlayabilir. Bundan sonra bir konfigürasyon talep ettiğinizde ortama özel bir değer alacaksınız.

Örneğin pc1 ve pc2 adında iki geliştirme makinenizin ve pc3 adında bir üretim makinenizin olduğunu varsayalım. Pc1 veya pc2'deki kodunuzda yapılandırma değerleri talep ettiğinizde, "geliştirme" ortamı yapılandırmasını ve pc3'te "üretim" ortamı yapılandırmasını almanız gerekir. Bu şu şekilde başarılabilir:

  1. Yapılandırma dizininde bir temel yapılandırma dosyası oluşturun, "app.json" diyelim ve gerekli yapılandırmaları buna ekleyelim.
  2. Şimdi yapılandırma dizininde ortam adınızla eşleşen klasörler oluşturun, bu durumda "geliştirme" ve "üretim".
  3. Ardından, geçersiz kılmak istediğiniz yapılandırma dosyalarını oluşturun ve ortam dizinlerinde her ortam için seçenekleri belirtin (Temel yapılandırma dosyasındaki her seçeneği belirtmeniz gerekmediğini, yalnızca geçersiz kılmak istediğiniz seçenekleri belirtmeniz gerektiğine dikkat edin. ortam yapılandırma dosyaları, temel dosyalar üzerinde "basamaklanır".).

Şimdi aşağıdaki sözdizimi ile yeni yapılandırma örneği oluşturun.

var config = require('nodejs-config')(
   __dirname,  // an absolute path to your applications 'config' directory
   {
      development: ["pc1", "pc2"],
      production: ["pc3"],

   }
);

Artık, bunun gibi ortam hakkında endişelenmeden herhangi bir yapılandırma değeri elde edebilirsiniz:

config.get('app').configurationKey;

0

Bu cevap yeni bir şey değil. @Andy_t'in bahsettiği şeye benzer. Ancak aşağıdaki kalıbı iki nedenden dolayı kullanıyorum.

  1. Harici npm bağımlılıkları olmadan temiz uygulama

  2. Varsayılan yapılandırma ayarlarını çevre tabanlı ayarlarla birleştirin.

Javascript uygulaması

const settings = {
    _default: {
       timeout: 100
       baseUrl: "http://some.api/",
    },
    production: {
       baseUrl: "http://some.prod.api/",
    },
}
// If you are not using ECMAScript 2018 Standard
// https://stackoverflow.com/a/171256/1251350
module.exports = { ...settings._default, ...settings[process.env.NODE_ENV] }

Düğüm projemde genellikle typcript kullanırım. Aşağıda benim gerçek uygulamam kopyalanıp yapıştırılmıştır.

Typecript uygulaması

const settings: { default: ISettings, production: any } = {
    _default: {
        timeout: 100,
        baseUrl: "",
    },
    production: {
        baseUrl: "",
    },
}

export interface ISettings {
    baseUrl: string
}

export const config = ({ ...settings._default, ...settings[process.env.NODE_ENV] } as ISettings)
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.