1. 程式人生 > >Node.js 專案的配置檔案

Node.js 專案的配置檔案

在使用 Node.js 編寫一個完整的專案時,程式中往往需要用到一些可配置的變數,從而使得程式能在不同的環境中執行。本文將介紹幾種常見的方法。

通過環境變數指定配置

環境變數(environment variables) 一般是指在作業系統中用來指定作業系統執行環境的一些引數,如:臨時資料夾位置和系統資料夾位置等。比如HOME表示當前使用者的根目錄,TMPDIR表示系統臨時目錄等,我們可以通過設定一些特定的環境變數,程式在啟動時可以讀取這些環境變數並做相應的初始化動作。

在 Node.js 中可以通過process.env來訪問當前的環境變數資訊,比如:

{ 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'
}

設定環境變數

環境變數的名字一般為大寫,多個單詞之間可通過下劃線來連線。

Windows 系統下可通過set命令來設定環境變數,比如:

$ set HELLO_MSG="Hello, world!"

Linux 系統下可通過export命令來設定,比如:

$ export HELLO_MSG="Hello, world!"

在 Node.js 中讀取環境變數

建立檔案1.js,程式碼如下:

console.log(process.env.HELLO_MSG);

然後在命令列中執行:

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

控制檯將輸出Hello, world,即我們啟動程式時給環境變數HELLO_MSG設定的值。

通過配置檔案指定配置

一些規模較小的專案往往會通過單一的配置檔案來儲存其配置,比如 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()來載入此檔案,得到一個物件,然後通過此物件的屬性來讀取相應的配置資訊:

// 載入配置檔案
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命令來啟動程式,而不需要單獨建立一個配置檔案。大多數時候往往會結合這兩種方式來進行,下文講詳細講解。

其他配置檔案格式

一般為了方便,在 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.host和Customer.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模組的詳細使用方法可閱讀其幫助文件。

參考文獻

相關模組

相關推薦

Node.js專案的package.json配置檔案中的devdependencies 和 dependencies的區別

1、dependencies和devDependencies 具體程式碼如下 "name": "webpack-react-express", "version": "0.2.0", "private": true, "dependencies": {

Node.js 專案中的配置檔案

在使用 Node.js 編寫一個完整的專案時,程式中往往需要用到一些可配置的變數,從而使得程式能在不同的環境中執行。 1.通過環境變數指定配置 環境變數(environment variables)一般是指在作業系統中用來指定作業系統執行環境的一些引數,如:臨時資料夾

Node.js 專案配置檔案

在使用 Node.js 編寫一個完整的專案時,程式中往往需要用到一些可配置的變數,從而使得程式能在不同的環境中執行。本文將介紹幾種常見的方法。 通過環境變數指定配置 環境變數(environment variables) 一般是指在作業系統中用來指定作業

Windows——Node.js安裝配置+Vue安裝及建立Vue專案

  Node.js安裝 安裝環境 Windows 10 Enterprise-X64 node-v10.13.0-x64.msi 安裝步驟 下載對應你係統的Node.js版本——選安裝目錄進行安裝——環境配置——測試 簡介

node.js express配置允許跨域

ati let pre char -h json requested all -c app.all(‘*‘, function(req, res, next) { res.header("Access-Control-Allow-Origin", "*");

Node.js專案

這裡mongose語言可以參考https://www.jianshu.com/p/2f54b90efe15 首先配置好入口檔案app.js app.js中比較重要的兩個模組是express  swig(用於解析模板內容) 檔案解析模板swig的配置

Node.js中fs檔案系統-與檔案file相關;

1.首先引入fs檔案模組; //讀取檔案; fs.readFile(path[, options], callback)  path:檔名; options:檔案讀取方式; callback:回撥函式;回撥函式有兩個引數err data  其中data是檔案的

node.js在讀取檔案時中文亂碼問題

斷更很久了........從今天開始會努力的持續更博,積極學習。 言歸正傳。今天在寫node.js的demo時發現一個bug。我在node中讀取本地的text檔案時,發現英文的內容可以被讀取,但是中文的就顯示的是亂碼。如下圖   產生這種問題的原因是: Windows下預設的編碼格式是AS

node.js中的檔案系統

檔案開啟操作 fs.open(path, flags[, mode], callback) path: <string>|<Buffer>|<URL> flags: <string>|<number> mode: <integ

ssm專案配置檔案中的包掃描bean,排除特定bean的掃描

ssm專案配置檔案中的包掃描bean springMVC.xml: 自動掃描controller包下的所有類,使其認為spring mvc的控制器    <!-- 自動掃描controller包下的所有類,使其認為spring mvc的控制器 --> &

websocket和 node.js 安裝配置

隨筆-82  文章-0  評論-3  Windows下Node.js+Express+WebSocket 安裝配置 Linux參考: Linux安裝Node.js  使用Express搭建Web伺服器    

Appium搭建一:Node.js安裝配置

Node.js安裝包及原始碼下載地址為:https://nodejs.org/en/download/。 你可以根據不同平臺系統選擇你需要的Node.js安裝包。 Node.js 歷史版本下載地址:https://nodejs.org/dist/ 注意:Linux上安裝Node.j

Node.js中的檔案系統的簡要說明

在node.js中的有著檔案系統fs這樣一個自帶的模組, 我們在使用它的時候只需引入即可: var fs =require('fs'); 在fs這個模組中有許多的檔案操作API,在這裡我只說幾個我常見的API, 或者說我就是會這幾個API,哈哈哈!!! 在這之前,我想說明一下,我

教你webpack、react和node.js環境配置(下篇)

上篇我介紹了前端下webpack和react、redux等環境的配置,這篇將繼續重點介紹後臺node.js的配置。 我把所有程式碼都放到了我的github上:webpack-react-express環境配置 server 後臺這邊的配置就簡單了很多,我這裡拿node.js的exp

idea Maven專案配置檔案讀取不到、配置檔案讀取出現問題

 可以通過在pom檔案的build標籤中插入以下程式碼解決 <resources> <resource> <directory>src\main\resources</directory>

阿里雲ECS伺服器部署Node.js專案詳細教程及多網站部署

本文詳細介紹如何部署NodeJS專案到阿里雲ECS上,以及本人在部署過程中所遇到的問題、坑點和解決辦法,可以說是全網最全最詳細的教程了。同時講解了如何申請阿里雲免費SSL證書,以及一臺ECS伺服器配置多網站的Nginx配置方法等。 作者:Kovli 1. 雲伺

c# 建立到資料來源的連線 以及獲取專案配置檔案的屬性

兩種連線資料庫的寫法: <connectionStrings> <add name="HRModelsContainer" connectionString="metadata=res://*/Domain.HRModels.csdl|res://*/Domain.HRMod

node.js中的檔案引入

//方法一: const fs = require('fs') //讀取內容 fs.readFile('./成績.txt','utf8',(err,datastr)=>{ //轉陣列 //處理 var arr = datastr.split('

node.js操作json檔案用es6的find方法報錯students.find is not function分享

報錯截圖如上 程式碼是node.js用fs操作json檔案,程式碼沒錯,但是一直報錯。。。 後來找了很久之後發現之前測試刪除功能時,把json檔案的students陣列刪了只剩一條資料了,json檔案把本來應該是陣列格式的資料,如下 :  結果是變成了這樣。。。。

Node.js 安裝配置

你可以根據不同平臺系統選擇你需要的Node.js安裝包。 注意:Linux上安裝Node.js需要安裝Python 2.6 或 2.7 ,不建議安裝Python 3.0以上版本。 Window 上安裝Node.js 你可以採用以下兩種方式來安裝。 1、Wi