主要經過學習《Node.js實戰(第2版)》總結,推薦閱讀node
Connect 是一個 node 中間件框架。Express 就是基於 Connect 開發的。npm
若是把一個 HTTP 處理過程比做是污水處理,中間件就像是一層層的過濾網,過濾網有各自不一樣的做用。閉包
$ npm install connect
app
const app = require('connect')();
// 傳給 app.use 的函數就是一箇中間件
app.use((req, res, next) => {
res.end('Hello, world!');
});
app.listen(3000);
複製代碼
Connect 中間件就是 JavaScript 函數。函數通常有三個參數:框架
一箇中間件完成本身的工做後,若是要執行後續的中間件,須要調用 next
回調函數。函數
藉助中間件 API,能夠把一些小的功能組合到一塊兒,實現複雜的處理邏輯。學習
Connect 中的 use
方法就是用來組合中間件的。ui
const connect = require('connect');
// 輸出 HTTP 請求的方法和 URL 並調用 next() 執行後續中間件
function logger(req, res, next) {
console.log('%s %s', req.method, req.url);
next();
}
// 響應 HTTP 的請求
function hello(req, res, next) {
res.setHeader('Content-Type', 'text/plain');
res.end('hello world');
}
// 按順序組合中間件
connect()
.use(logger)
.use(hello)
.listen(3000);
複製代碼
注意組合中間件的順序很重要,若是某個中間件不調用 next()
,那麼在它後面的中間件就不會被調用。url
普通的中間件寫法沒辦法經過傳參數來實現擴展性或通用性,至關於寫死了,自由度不高。spa
可配置的中間件寫法通常這樣:用一個函數返回另外一個函數(閉包)。
// 基本結構
function setup(options) {
// 這裏作中間件的初始化邏輯
...
return function(req, res, next) {
// 中間件邏輯
...
}
}
// 使用方法。經過 options 能夠傳入一些配置參數
const options = { ... };
app.use(setup(options));
複製代碼
好比一個可配置的中間件 logger.js
function setup(format) {
const regexp = /:(\w+)/g;
return function createLogger(req, res, next) {
// 根據傳入的參數提取響應的信息
const str = format.replace(regexp, (match, property) => {
return req[property];
});
console.log(str);
next();
}
}
module.exports = setup;
複製代碼
Connect 有一種用來處理錯誤的中間件變體,比常規中間件多了一個錯誤對象參數。
必須有四個參數:err
、req
、res
、next
錯誤處理中間件有兩種工做機制:
當 Connect 遇到錯誤時,會跳過常規中間件,只去調用錯誤處理中間件。好比:
connect()
.use(mw1) // 出錯
.use(mw2) // 跳過
.use(mw3) // 跳過
.use(errorHandler) // 執行
複製代碼