Node.js 項目的配置文件

在 Node.js 中能夠經過process.env來訪問當前的環境變量信息,好比:javascript

{ PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', TMPDIR: '/var/folders/rs/g4wqpvvj7bj08t35dxvfm0rr0000gn/T/', LOGNAME: 'glen', XPC_FLAGS: '0x0', HOME: '/Users/glen', TERM: 'xterm-256color', COLORFGBG: '7;0', USER: 'glen', ITERM_PROFILE: 'Glen', TERM_PROGRAM: 'iTerm.app', XPC_SERVICE_NAME: '0', SHELL: '/bin/zsh', ITERM_SESSION_ID: 'w0t4p0', PWD: '/Users/glen/work', __CF_USER_TEXT_ENCODING: '0x1F5:0x0:0x0', LC_CTYPE: 'UTF-8', SHLVL: '1', OLDPWD: '/Users/glen/work', ZSH: '/Users/glen/.oh-my-zsh', PAGER: 'less', LESS: '-R', LSCOLORS: 'Gxfxcxdxbxegedabagacad', AUTOJUMP_SOURCED: '1', AUTOJUMP_ERROR_PATH: '/Users/glen/Library/autojump/errors.log', RUST_SRC_PATH: '/Users/glen/work/source/rust/src', _: '/usr/local/bin/node' }

 

設置環境變量

環境變量的名字通常爲大寫,多個單詞之間可經過下劃線來鏈接。html

Windows 系統下可經過set命令來設置環境變量,好比:java

$ set HELLO_MSG="Hello, world!"

Linux 系統下可經過export命令來設置,好比:node

$ export HELLO_MSG="Hello, world!"

在 Node.js 中讀取環境變量

建立文件1.js,代碼以下:git

console.log(process.env.HELLO_MSG);

而後在命令行中執行:github

$ export HELLO_MSG="Hello, world" && node 1.js

控制檯將輸出Hello, world,即咱們啓動程序時給環境變量HELLO_MSG設置的值。redis

經過配置文件指定配置

一些規模較小的項目每每會經過單一的配置文件來存儲其配置,好比 CNode 中文社區的開源項目 nodeclub 在啓動時會載入文件config.js,該文件的大概結構以下:數據庫

var config = { // debug 爲 true 時,用於本地調試 debug: true, name: 'Nodeclub', // 社區名字 description: 'CNode:Node.js專業中文社區', // 社區的描述 keywords: 'nodejs, node, express, connect, socket.io', // 其餘配置項... }; module.exports = config;

在程序啓動的時候,可使用require()來載入此文件,獲得一個對象,而後經過此對象的屬性來讀取相應的配置信息:express

// 載入配置文件 var config = require('./config'); // 如下爲使用到配置的部分代碼: if (!config.debug && config.oneapm_key) { require('oneapm'); } app.use(session({ secret: config.session_secret, store: new RedisStore({ port: config.redis_port, host: config.redis_host, }), resave: true, saveUninitialized: true, })) app.listen(config.port, function () { logger.log('NodeClub listening on port', config.port); logger.log('God bless love....'); logger.log('You can debug your app with http://' + config.hostname + ':' + config.port); logger.log(''); });

使用配置文件與使用環境變量來指定配置相比,配置文件的可讀性更強,能夠表示一些更復雜的結構,而使用環境變量通常只限於key=value的形式。但在配置項數量較少時,使用環境變量會更簡單,好比項目中只須要配置一個監聽端口,能夠簡單使用export PORT=3000 && node app.js命令來啓動程序,而不須要單首創建一個配置文件。大多數時候每每會結合這兩種方式來進行,下文講詳細講解。npm

其餘配置文件格式

通常爲了方便,在 Node.js 項目中會習慣使用.js文件格式,它的好處是可使用經過程序來動態生成一些配置項,好比 nodeclub 的其中一個配置項:

var config = { // 文件上傳配置 // 注:若是填寫 qn_access,則會上傳到 7牛,如下配置無效 upload: { path: path.join(__dirname, 'public/upload/'), url: '/public/upload/' }, }

其中使用到了path.join()__dirname來生成upload.path

JSON格式

另外,咱們也可使用 JSON 格式的配置文件,好比文件config.json

{ "debug": true, "name": "Nodeclub", "description": "CNode:Node.js專業中文社區", "keywords": "nodejs, node, express, connect, socket.io" }

在程序中能夠經過如下方式來載入JSON文件配置:

// 經過require()函數 var config = require('./config.json'); // 讀取文件並使用JSON.parse()解析 var fs = require('fs'); var config = JSON.parse(fs.readFileSync('./config.json').toString());

大多數時候,咱們每每須要添加一些備註信息來講明某個配置項的使用方法及用途,在標準JSON文件中是不容許添加備註的,咱們可使用strip-json-comments模塊來去掉配置文件中的備註,再將其看成標準的JSON來解析。

好比如下是帶備註信息的JSON配置文件:

{ // debug 爲 true 時,用於本地調試 "debug": true, // 社區名字 "name": "Nodeclub", // 社區的描述 "description": "CNode:Node.js專業中文社區", "keywords": "nodejs, node, express, connect, socket.io" }

咱們能夠編寫一個loadJSONFile()函數來載入帶有備註的JSON文件:

var fs = require('fs'); var stripJsonComments = require('strip-json-comments'); function loadJSONFile (file) { var json = fs.readFileSync(file).toString(); return JSON.parse(stripJsonComments(json)); } var config = loadJSONFile('./config.json'); console.log(config);

YAML格式

YAML 是面向全部編程語言的對人類友好的數據序列化標準。其最大的優勢是可讀性較好,好比如下 YAML 格式的配置:

name: John Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name: Jenny Smith age: 12

其對應的JSON結構以下:

{ "age": 37, "spouse": { "age": 25, "name": "Jane Smith" }, "name": "John Smith", "children": [ { "age": 15, "name": "Jimmy Smith" }, { "age": 12, "name": "Jenny Smith" } ] }

在 Node.js 中能夠經過yamljs模塊來解析 YAML 格式,好比能夠編寫一個loadYAMLFile()函數來載入 YAML 格式的配置文件:

var fs = require('fs'); var YAML = require('yamljs'); function loadYAMLFile (file) { return YAML.parse(fs.readFileSync(file).toString()); } var config = loadYAMLFile('./config.yaml'); console.log(config);

根據運行環境選擇不一樣的配置

大多數狀況下,程序在本地開發環境和生產環境中的配置信息是不同的,好比開發時鏈接到的數據庫裏面的數據是模擬出來的,而生產環境要鏈接到實際的數據庫上,所以咱們須要讓程序能根據不一樣的運行環境來載入不一樣的配置文件。

使用單一配置文件名

以 nodeclub 項目爲例,其載入的配置文件名爲./config.js,項目中有一個默認配置文件./config.default.js。要運行程序,首先須要複製一份默認配置文件,並保存爲./config.js,再根據當前運行環境來修改./config.js

因爲./config.js文件已經被添加到.gitignore文件中,所以咱們./config.js文件的修改不會被歸入到項目的版本管理中,因此不一樣機器中的./config.js不會產生衝突,可使用各自的配置來啓動程序。

經過環境變量指定配置文件名

咱們能夠經過環境變量來指定配置文件,好比:

$ export CONFIG_FILE="./config/production.js"

而後能夠經過如下方式來載入配置文件:

var path = require('path'); var config = require(path.resolve(process.env.CONFIG_FILE));

另外,也能夠經過環境變量來指定當前運行環境的名稱,而後在指定目錄下載入相應的配置,好比:

$ export NODE_ENV="production"

而後能夠經過如下方式來載入配置文件:

var path = require('path'); var configFile = path.resolve('./config', process.env.NODE_ENV + '.js'); var config = require(configFile);

使用 config 模塊來讀取配置

config 模塊是 NPM 上下載量最高的 Node.js 配置文件管理模塊,其實現原理與上文中介紹的方法大同小異,在實際開發中咱們能夠考慮使用這個現成的模塊。下面將介紹此模塊的簡單使用方法。

config模塊經過環境變量NODE_CONFIG_DIR來指定配置文件所在的目錄,默認爲./config(即當前運行目錄下的config目錄),經過環境變量NODE_ENV來指定當前的運行環境版本。

配置文件使用 JSON 格式,模塊加載後,會首先載入默認的配置文件${NODE_CONFIG_DIR}/default.json,再載入文件${NODE_CONFIG_DIR}/${NODE_ENV}.json,若是配置項有衝突則覆蓋默認的配置。

好比咱們新建默認配置文件config/default.json

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

再新建production環境配置文件config/production.json

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

再新建測試文件1.js

var config = require('config'); console.log(config);

執行程序,可看到其輸出的結果爲默認的配置:

{ Customer: { dbConfig: { host: 'localhost', port: 5984, dbName: 'customers' }, credit: { initialLimit: 100, initialDays: 1 } } }

假如要使用production的配置,則使用如下命令啓動:

$ export NODE_ENV=production && node 1.js

則其輸出將是以下結果:

{ Customer: { dbConfig: { host: 'prod-db-server', port: 5984, dbName: 'customers' }, credit: { initialLimit: 100, initialDays: 30 } } }

production.json文件中,從新定義了Customer.dbConfig.hostCustomer.credit.initialDays這兩個配置項,因此在production環境中僅這兩項被覆蓋爲新的值,而其餘配置項則使用default.json中指定的值。

載入config模塊後,其返回的對象實際上就是當前的配置信息,同時提供了兩個方法get()has()來操做配置項。好比:

var config = require('config'); console.log(config); console.log(config.get('Customer')); console.log(config.get('Customer.dbConfig')); console.log(config.has('Customer.dbConfig.host')); console.log(config.has('Customer.dbConfig.host2'));

執行程序後輸出結果以下:

{ Customer: { dbConfig: { host: 'localhost', port: 5984, dbName: 'customers' }, credit: { initialLimit: 100, initialDays: 1 } } } { dbConfig: { host: 'localhost', port: 5984, dbName: 'customers' }, credit: { initialLimit: 100, initialDays: 1 } } { host: 'localhost', port: 5984, dbName: 'customers' } true false

其中get()用來獲取指定配置,可使用諸如Customer.dbConfig這樣的格式,若是配置項不存在則會拋出異常。has()用來檢測指定配置項是否存在,若是存在則返回true

關於config模塊的詳細使用方法可閱讀其幫助文檔。

參考文獻

相關模塊


原文連接:http://morning.work/page/2015-09/nodejs_project_config_loader.html 轉載請註明出處

相關文章
相關標籤/搜索