主要通過學習《Node.js實戰(第2版)》總結,推薦閱讀
瞭解 Connect
Connect 是一個 node 中介軟體框架。Express 就是基於 Connect 開發的。
如果把一個 HTTP 處理過程比作是汙水處理,中介軟體就像是一層層的過濾網,過濾網有各自不同的作用。
安裝
$ npm install connect
Demo
const app = require('connect')();
// 傳給 app.use 的函式就是一箇中介軟體
app.use((req, res, next) => {
res.end('Hello, world!');
});
app.listen(3000);
複製程式碼
Connect 中介軟體
Connect 中介軟體就是 JavaScript 函式。函式一般有三個引數:
- req(請求物件)
- res(響應物件)
- next(回撥函式)
一箇中介軟體完成自己的工作後,如果要執行後續的中介軟體,需要呼叫 next
回撥函式。
作用
藉助中介軟體 API,可以把一些小的功能組合到一起,實現複雜的處理邏輯。
如何組合中介軟體?
Connect 中的 use
方法就是用來組合中介軟體的。
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()
,那麼在它後面的中介軟體就不會被呼叫。
如何建立可配置的中介軟體?
普通的中介軟體寫法沒辦法通過傳引數來實現擴充套件性或通用性,相當於寫死了,自由度不高。
可配置的中介軟體寫法一般這樣:用一個函式返回另一個函式(閉包)。
// 基本結構
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 遇到錯誤時,會跳過常規中介軟體,只去呼叫錯誤處理中介軟體。比如:
connect()
.use(mw1) // 出錯
.use(mw2) // 跳過
.use(mw3) // 跳過
.use(errorHandler) // 執行
複製程式碼
參考
- 《Nodejs基礎中介軟體Connect》
- 《Node.js實戰(第2版)》