Saya telah bekerja pada beberapa aplikasi Node, dan saya telah mencari pola yang baik untuk menyimpan pengaturan terkait penempatan. Di dunia Django (dari mana saya berasal), praktik umum adalah memiliki settings.py
file yang berisi pengaturan standar (zona waktu, dll), dan kemudian local_settings.py
untuk pengaturan spesifik penempatan, yaitu. database apa yang harus diajak bicara, soket memcache apa, alamat email untuk admin dan sebagainya.
Saya telah mencari pola serupa untuk Node. Hanya file config yang bagus, jadi tidak harus macet dengan yang lainnya app.js
, tetapi saya merasa penting untuk memiliki cara untuk memiliki konfigurasi khusus server dalam file yang tidak ada dalam kontrol sumber. Aplikasi yang sama bisa digunakan di server yang berbeda dengan pengaturan yang sangat berbeda, dan harus berurusan dengan menggabungkan konflik dan semua itu bukan ide saya yang menyenangkan.
Jadi apakah ada semacam kerangka / alat untuk ini, atau apakah semua orang hanya meretas sesuatu bersama?
Jawaban:
Saya menggunakan a
package.json
untuk paket saya danconfig.js
untuk konfigurasi saya, yang terlihat seperti:Saya memuat konfigurasi dari proyek saya:
dan kemudian saya dapat mengakses barang-barang saya dari
config.db_host
,,config.db_port
dll ... Ini memungkinkan saya menggunakan parameter hardcoded, atau parameter yang disimpan dalam variabel lingkungan jika saya tidak ingin menyimpan kata sandi dalam kontrol sumber.Saya juga membuat
package.json
dan memasukkan bagian dependensi:Ketika saya mengkloning proyek ke mesin lokal saya, saya menjalankan
npm install
untuk menginstal paket. Info lebih lanjut tentang itu di sini .Proyek disimpan di GitHub, dengan remote ditambahkan untuk server produksi saya.
sumber
Anda dapat meminta file JSON sejak Node v0.5.x ( merujuk jawaban ini )
config.json:
app.js:
sumber
Jauh kemudian, saya menemukan modul Node.js yang cukup bagus untuk mengelola konfigurasi: nconf .
Contoh sederhana:
Ini juga mendukung pengaturan penyimpanan di Redis , menulis file konfigurasi, dan memiliki API yang cukup solid, dan juga didukung oleh salah satu toko Node.js yang lebih dihormati, Nodejitsu , sebagai bagian dari Flatiron inisiatif kerangka kerja , jadi seharusnya cukup bukti di masa depan.
Lihat nconf di Github .
sumber
Solusi saya cukup sederhana:
Memuat konfigurasi lingkungan ./config/index.js
Tetapkan beberapa default di ./config/config.global.js
Timpa default di ./config/config.test.js
Menggunakannya di ./models/user.js:
Menjalankan aplikasi Anda di lingkungan pengujian:
sumber
NODE_ENV
standarnya adalah 'pengembangan'. Anda harus memeriksa 'produksi' sebagai gantinya.Anda mungkin juga mencari dotenv yang mengikuti prinsip aplikasi dua belas faktor .
Saya dulu menggunakan node-config, tetapi menciptakan dotenv karena alasan itu. Itu benar-benar terinspirasi oleh perpustakaan dotenv ruby.
Penggunaannya cukup mudah:
Kemudian Anda hanya membuat file .env dan meletakkan pengaturan Anda di sana seperti:
Itu dotenv untuk nodejs.
sumber
foreman run node xx.js
ini akan secara otomatis membaca dalam file .env Anda juga..env
file dalam kontrol versi atau proses penerapan Anda.Apakah kalian menggunakan npm untuk memulai skrip Anda (env dll)?
Jika Anda menggunakan
.env
file, Anda dapat memasukkannya ke dalampackage.json
dan menggunakan npm untuk sumber / memulainya.Contoh:
kemudian jalankan skrip npm:
Ini dijelaskan di sini https://gist.github.com/ericelliott/4152984 Semua kredit untuk Eric Elliot
sumber
source : not found
source
(atau sederhananya,.
) adalah perintah bawaan di shell Unix (Bash, dll.) Untuk membaca dan menjalankan perintah dari file yang diberikan, di shell saat ini . Artinya, perintah tidak dieksekusi dalam sub-shell. Efek dari hal itu dalam contoh ini adalah bahwa variabel lingkungan yang didefinisikanprod.env
ditambahkan ke shell saat ini dan karenanya, diteruskan ke setiap proses anak yang dihasilkan oleh shell ini. Anda sepertinya menggunakan Windows CMD. Lihat pertanyaan ini untuk lebih jelasnya.dev.env
danprod.env
, tetapi memiliki satu.env
file per penyebaran.Anda mungkin juga melihat ke node-config yang memuat file konfigurasi tergantung pada variabel $ HOST dan $ NODE_ENV (sedikit seperti RoR): dokumentasi .
Ini bisa sangat berguna untuk pengaturan penyebaran yang berbeda (
development
,test
atauproduction
).sumber
Cukup lakukan sederhana
settings.js
denganexports
:Kemudian, dalam skrip Anda, lakukan
require
:Semua pengaturan Anda sekarang akan tersedia melalui
settings
variabel:sumber
Saya akan melemparkan topi saya ke atas ring di sini karena tidak satu pun dari jawaban ini membahas semua komponen penting yang dibutuhkan sistem apa pun. Pertimbangan:
Inilah cara saya melakukan konfigurasi:
config.default.private.js
- Dalam kontrol versi, ini adalah opsi konfigurasi default yang hanya dapat dilihat oleh backend Anda.config.default.public.js
- Dalam kontrol versi, ini adalah opsi konfigurasi default yang dapat dilihat oleh backend dan frontendconfig.dev.private.js
- Jika Anda memerlukan standar pribadi yang berbeda untuk dev.config.dev.public.js
- Jika Anda memerlukan default publik yang berbeda untuk dev.config.private.js
- Tidak dalam kontrol versi, ini adalah opsi khusus lingkungan yang menimpaconfig.default.private.js
config.public.js
- Tidak dalam kontrol versi, ini adalah opsi khusus lingkungan yang menimpaconfig.default.public.js
keys/
- Folder tempat setiap file menyimpan rahasia yang berbeda. Ini juga bukan di bawah kontrol versi (kunci tidak boleh berada di bawah kontrol versi).Saya menggunakan file javascript biasa-lama untuk konfigurasi jadi saya memiliki kekuatan penuh dari langauge javascript (termasuk komentar dan kemampuan untuk melakukan hal-hal seperti memuat file konfigurasi default dalam file khusus lingkungan sehingga kemudian dapat diganti). Jika Anda ingin menggunakan variabel lingkungan, Anda dapat memuatnya di dalam file-file konfigurasi (tho saya sarankan agar tidak menggunakan env vars untuk alasan yang sama saya tidak merekomendasikan menggunakan file json - Anda tidak memiliki kekuatan bahasa pemrograman untuk membangun konfigurasi Anda).
Alasan setiap kunci dalam file terpisah adalah untuk penggunaan installer. Ini memungkinkan Anda untuk memiliki penginstal yang membuat kunci di mesin dan menyimpannya di folder kunci. Tanpa ini, installer Anda mungkin gagal ketika Anda memuat file konfigurasi Anda yang tidak dapat mengakses kunci Anda. Dengan cara ini Anda dapat melintasi direktori dan memuat file kunci apa pun yang ada di folder itu tanpa harus khawatir tentang apa yang ada dan apa yang tidak ada dalam versi kode Anda.
Karena Anda mungkin memiliki kunci yang dimuat dalam konfigurasi pribadi Anda, Anda pasti tidak ingin memuat konfigurasi pribadi Anda dalam kode frontend apa pun. Walaupun ini mungkin lebih ideal untuk memisahkan basis kode frontend Anda dari backend Anda, sering kali PITA merupakan penghalang yang cukup besar untuk mencegah orang melakukannya, dengan demikian konfigurasi privat vs publik. Tapi ada dua hal yang saya lakukan untuk mencegah konfigurasi pribadi dimuat di frontend:
Satu hal terakhir: konfigurasi Anda harus dimuat ke browser melalui file yang benar - benar terpisah dari kode frontend lainnya. Jika Anda bundel kode frontend Anda, konfigurasi publik harus dibangun sebagai bundel yang benar-benar terpisah. Jika tidak, konfigurasi Anda tidak benar-benar konfigurasi lagi - itu hanya bagian dari kode Anda. Config harus dapat berbeda pada mesin yang berbeda.
sumber
Terpidana adalah pilihan lain yang menambahkan skema untuk validasi. Seperti nconf, ia mendukung pengaturan pemuatan dari kombinasi variabel lingkungan, argumen, file, dan objek json.
Contoh dari README:
Artikel persiapan : Menjinakkan Konfigurasi dengan simpul-terpidana
sumber
Anda dapat menggunakan Konfig untuk file konfigurasi khusus lingkungan. Ini memuat file konfigurasi json atau yaml secara otomatis, ia memiliki nilai default dan fitur konfigurasi dinamis.
Contoh dari Konfig repo:
Dalam pengembangan:
Dalam produksi, anggap kita memulai aplikasi dengan
$ NODE_ENV=production PORT=4567 node app.js
Rincian lebih lanjut: https://github.com/vngrs/konfig
sumber
Saya akan membuat folder sebagai config penamaan file
config.js
dan kemudian saya akan menggunakan file ini dimanapun diperlukan seperti di bawah iniContoh config.js
Lalu jika saya ingin menggunakan file konfigurasi ini di suatu tempat
Pertama-tama saya akan mengimpor seperti di bawah ini
var config = require('./config');
dan saya dapat mengakses nilai-nilai seperti di bawah ini
sumber
Cukup gunakan
npm
modulconfig
(lebih dari 300000 unduhan)https://www.npmjs.com/package/config
Node-config mengatur konfigurasi hierarkis untuk penerapan aplikasi Anda.
Ini memungkinkan Anda menentukan seperangkat parameter default, dan memperluasnya untuk lingkungan penyebaran yang berbeda (pengembangan, qa, pementasan, produksi, dll.).
sumber
Lebih baik memisahkan konfigurasi 'pengembangan' dan 'produksi' .
Saya menggunakan cara berikut: Ini adalah file config / index.js saya :
Untuk memerlukan konfigurasi gunakan sebagai berikut:
Daripada Anda dapat menggunakan objek konfigurasi Anda:
sumber
module.exports = config;
di akhirconfig/index.js
fileSaya agak terlambat dalam permainan, tetapi saya tidak dapat menemukan apa yang saya butuhkan di sini - atau di tempat lain - jadi saya menulis sesuatu sendiri.
Persyaratan saya untuk mekanisme konfigurasi adalah sebagai berikut:
settings-overrides.js
- yang terlihat sama tetapi memungkinkan penggantian konfigurasisettings.js
. Idenya di sini adalah untuk memodifikasi konfigurasi dengan mudah tanpa mengubah kode. Saya menemukan itu berguna untuk sauna.Meskipun saya kurang peduli tentang lingkungan pendukung - kehendak menjelaskan cara menambahkannya dengan mudah ke solusi saya
Penjelasan
undefined
berarti properti ini diperlukannull
berarti itu opsionalmeConf
- Saat ini kode tersebut ditargetkan ke file di bawahapp
.meConf
adalah file utama yang ditargetkan untukconf/dev
- yang diabaikan oleh vcs saya.publicConfiguration
- Akan terlihat dari front-end dan back-end.privateConfiguration
- Akan terlihat dari back-end saja.sendPublicConfiguration
- rute yang akan mengekspos konfigurasi publik dan menetapkannya ke variabel global. Sebagai contoh, kode di bawah ini akan memperlihatkan konfigurasi publik sebagai variabel global myConf di front-end. Secara default akan menggunakan nama variabel globalconf
.app.get ("/ backend / conf", memerlukan ("conf"). sendPublicConfiguration);
Logika penimpaan
Menambahkan dukungan lingkungan
Meskipun saya tidak menemukan "dukungan lingkungan" berguna, mungkin seseorang akan melakukannya.
Untuk menambahkan dukungan lingkungan Anda perlu mengubah meConf membutuhkan pernyataan untuk sesuatu seperti ini (pseudocode)
if (environment == "production") {meConf = require ("../ conf / dev / meConf"). produksi; }
if (environment == "development") {meConf = membutuhkan ("../ conf / dev / meConf"). development; }
Demikian pula Anda dapat memiliki file per lingkungan
dan impor yang benar. Logika lainnya tetap sama.
sumber
undefined
benar - benar berarti 'wajib' dannull
berarti 'opsional'. jadi bin kuning untuk plastik dan biru untuk kertas bekas? baik, tetapi harus membaca manual sebelum membuang sampah itu.contoh alt yang baru saja saya gunakan karena saya ingin lebih banyak fleksibilitas daripada file .json yang khas tetapi tidak ingin disarikan ke perpustakaan yang memerlukan ketergantungan adalah sesuatu seperti ini. Pada dasarnya, mengekspor fungsi yang dipanggil segera yang mengembalikan objek dengan nilai yang ingin saya atur. Memberikan banyak fleksibilitas.
Ada penjelasan yang jauh lebih baik dengan contoh lengkap di sini. Menggunakan File Config di Node.js
sumber
Saya tahu ini adalah posting yang sangat lama. Tetapi saya ingin membagikan modul saya untuk mengonfigurasi variabel lingkungan, saya pikir ini adalah solusi yang sangat fleksibel. Berikut ini adalah modul json-configurator
Kemudian Anda dapat menggunakan
process.env.NODE_ENV
untuk mendapatkan semua variabel untuk lingkungan Anda.sumber
Selain modul nconf yang disebutkan dalam jawaban ini , dan node-config yang disebutkan dalam jawaban ini , ada juga node-iniparser dan IniReader , yang tampaknya menjadi parser file konfigurasi .ini yang lebih sederhana.
sumber
iniparser
dengan bangga menekankan fakta bahwa mereka tahu cara mem-parsing bagian dalam konfigurasi ... pada 2013 ... jika Anda perlu bersarang lebih dalam, menurut Anda[foo/bar]
?[foo\bar]
?bar.baz=42
?bar/baz=42
?bar\baz=42
?bar:baz=42
? bagaimana Anda tahu42
nomor? itu bisa berupa teks semua-digit! —buang XML, lempar YAML, lempar WIN.INI, rangkul JSON, kekhawatiran hilang.Saya baru saja merilis modul kecil untuk memuat semua jenis file konfigurasi. Cukup mudah, Anda dapat memeriksanya di https://github.com/flesler/config-node
sumber
Anda dapat menggunakan pconf: https://www.npmjs.com/package/pconf
Contoh:
sumber
Berikut ini adalah pendekatan rapi yang terinspirasi oleh artikel ini . Ini tidak memerlukan paket tambahan kecuali di mana-mana paket lodash . Selain itu, ini memungkinkan Anda mengelola standar bersarang dengan timpa khusus lingkungan.
Pertama, buat folder config di path root paket yang terlihat seperti ini
di sini adalah file index.js
Sekarang mari kita asumsikan kita memiliki defaults.json seperti itu
dan development.json seperti itu
jika Anda lakukan di
config = require('./config')
sini adalah apa yang akan Anda dapatkanPerhatikan bahwa Anda mendapatkan semua nilai default kecuali yang ditentukan dalam file khusus lingkungan. Jadi, Anda dapat mengelola hierarki konfigurasi. Menggunakan
defaultsDeep
memastikan bahwa Anda bahkan dapat memiliki standar bersarang.sumber
Bagi mereka yang mengunjungi utas lama ini di sini adalah paket yang menurut saya bagus.
https://www.npmjs.org/package/config
sumber
Saya mencoba beberapa solusi yang disarankan di sini, tetapi tidak puas dengan mereka, jadi saya membuat modul saya sendiri. Itu disebut
mikro-config
dan perbedaan utamanya adalah ia menghormati konvensi atas konfigurasi, jadi Anda hanya dapat memerlukan modul dan mulai menggunakannya.Anda menyimpan konfigurasi Anda dalam file js, atau json biasa dari
/config
folder. Pertama memuatdefault.js
file, lalu semua file lain dari/config
direktori, lalu memuat konfigurasi khusus lingkungan berdasarkan$NODE_ENV
variabel.Ini juga memungkinkan untuk mengganti konfigurasi ini untuk pengembangan lokal dengan
local.js
atau khusus lingkungan/config/env/$NODE_ENV.local.js
.Anda dapat melihatnya di sini:
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
sumber
Untuk waktu yang lama, saya terbiasa menggunakan pendekatan yang disebutkan dalam solusi di sini. Namun ada kekhawatiran, tentang keamanan rahasia dalam teks yang jelas. Anda dapat menggunakan paket lain di atas
config
sehingga bit keamanan dijaga.Lihat ini: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
sumber