学习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,能够把一些小的功能组合到一块儿,实现复杂的处理逻辑。post

如何组合中间件?

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() ,那么在它后面的中间件就不会被调用。ui

如何建立可配置的中间件?

普通的中间件写法没办法经过传参数来实现扩展性或通用性,至关于写死了,自由度不高。url

可配置的中间件写法通常这样:用一个函数返回另外一个函数(闭包)。

// 基本结构
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版)》

转载于:https://juejin.im/post/5c23993cf265da612b13a4be