學習Node須知——中間件框架Connect

主要經過學習《Node.js實戰(第2版)》總結,推薦閱讀node

瞭解 Connect

Connect 是一個 node 中間件框架。Express 就是基於 Connect 開發的。npm

若是把一個 HTTP 處理過程比做是污水處理,中間件就像是一層層的過濾網,過濾網有各自不一樣的做用。閉包

安裝

$ npm install connectapp

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 方法就是用來組合中間件的。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 有一種用來處理錯誤的中間件變體,比常規中間件多了一個錯誤對象參數。

必須有四個參數:errreqresnext

錯誤處理中間件有兩種工做機制

  • 用 Connect 的默認錯誤處理器(自動處理)
  • 自行處理

當 Connect 遇到錯誤時,會跳過常規中間件,只去調用錯誤處理中間件。好比:

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

參考

  1. 《Nodejs基礎中間件Connect》
  2. 《Node.js實戰(第2版)》
相關文章
相關標籤/搜索