會使用到的套件:

主體:
express - web framework
body-parser - parse request body

測試相關:
mocha - test framework
mocha-mongoose - 用來和 mocha 和 mongoose 中間做介接的套件
superagent - 拿它來丟 http request
validator - 用來驗證某個物件是否為某個型別
expect.js - 類似 BDD 的語法,用來寫測試的
debug - debug package

DB 相關:
mongoose - mongodb orm
mongodb - mongodb native driver

開發相關:
nodemon - detect file change and restart server

生產環境相關:
log4js - 記錄 request log

這是我的 package.json, 可以複製到專案目錄,然後下 npm install

{
  "name": "TODOAPI",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node ./bin/server.js env=development",
    "test": "./node_modules/mocha/bin/mocha",
    "test-detail": "./node_modules/mocha/bin/mocha --reporter list",
    "stop": "pkill -lf server.js"
  },
  "author": "kerkerj",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.9.0",
    "debug": "^2.0.0",
    "expect.js": "^0.3.1",
    "express": "^4.9.5",
    "log4js": "^0.6.21",
    "mocha": "^1.21.4",
    "mocha-mongoose": "^1.0.1",
    "mongodb": "^1.4.19",
    "mongoose": "^3.8.17",
    "superagent": "^0.20.0",
    "validator": "^3.19.1"
  }
}

安裝套件,及全域套件 mocha

// in project folder
$ npm install express body-parser mocha mocha-mongoose superagent validator expect.js debug mongoose mongodb log4js -save 
$ npm install -g nodemon

各個套件簡單設定

接下來會針對一些套件作說明,但是由於可能有些人不懂整個專案的運作,因此下面看看就好,之後實作上有問題可以再回來看。

Nodemon 的作用

範例:

$ nodemon ./bin/server.js
...

就可以放著不管它了~ 只要檔案有變動,就會自動重開 server

使用 logger - log4js

設定 logger - log4js, 並將 log 寫入到 logs/access.log 裏

// Set logger
var log4js = require('log4js');
log4js.configure({
    appenders: [
        { type: 'console' }, //控制台輸出
        {
            type: 'file', //文件輸出
            filename: 'logs/access.log',
            maxLogSize: 20000000, // 20 MB
            backups: 10,
            category: 'normal'
        }
    ],
    replaceConsole: true
});

var logger = log4js.getLogger('normal');
logger.setLevel('INFO');

app.use(log4js.connectLogger(logger, {level: 'auto', format:':method :url'}));

node log4s

使用 body-parser 處理 request 的資料

加入 middleware

app.use( bodyParser.json() );
app.use( bodyParser.urlencoded({ extended: true }) );

需要加入 { extended: true/false }, 否則會 warning:

body-parser deprecated undefined extended: provide extended

如果要接收 json request

client 端在 Header 中必須先設定 “Content-type: applciation/json”

才能夠在 router 中使用 req.body 拿到 json 值

測試套件

mocha - 專案
expect.js - 專案
superagent - 專案

測試流程 -

先跑 server 起來,透過自動化程式自動丟 request 給 server,測試結束

$ npm start
$ mocha
$ npm stop

所以必須先在 package.json 中設定好 script

{
	(...)
	"scripts": {
      "start": "node ./bin/server.js",
      "test": "mocha",
      "stop": "pkill -lf server.js"
  },
  (...)
}

由於我將啟動 server 的 script 放在 bin 資料夾裡,因此

npm start 的 script 就會執行:

node ./bin/server.js

npm stop 的話,用到了 *nix 的指令,會先到 process list 中找到和 server.js 有關的 process,然後 kill process (pkill)

pkill -lf server.js

跑測試的話,直接下 mocha,在這邊我們也丟一個 script 指定給 npm test

npm test 就是等同於下 mocha

上面只是大致上講解一下每個套件如何用,接下來我們會以實際的例子來說明