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