学习Node须知——中间件框架Connect

3,781 阅读2分钟

主要通过学习《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版)》