學習Node須知——中介軟體框架Connect

小皮草發表於2018-12-26

主要通過學習《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 有一種用來處理錯誤的中介軟體變體,比常規中介軟體多了一個錯誤物件引數。

必須有四個引數:errreqresnext

錯誤處理中介軟體有兩種工作機制

  • 用 Connect 的預設錯誤處理器(自動處理)
  • 自行處理

當 Connect 遇到錯誤時,會跳過常規中介軟體,只去呼叫錯誤處理中介軟體。比如:

connect()
    .use(mw1) // 出錯
    .use(mw2) // 跳過
    .use(mw3) // 跳過
    .use(errorHandler) // 執行 
複製程式碼

參考

  1. 《Nodejs基礎中介軟體Connect》
  2. 《Node.js實戰(第2版)》

相關文章