主要经过学习《Node.js实战(第2版)》总结,推荐阅读node
了解 Connect
Connect 是一个 node 中间件框架。Express 就是基于 Connect 开发的。npm
若是把一个 HTTP 处理过程比做是污水处理,中间件就像是一层层的过滤网,过滤网有各自不一样的做用。闭包
安装
$ npm install connect
app
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 有一种用来处理错误的中间件变体,比常规中间件多了一个错误对象参数。
必须有四个参数:err
、req
、res
、next
错误处理中间件有两种工做机制:
- 用 Connect 的默认错误处理器(自动处理)
- 自行处理
当 Connect 遇到错误时,会跳过常规中间件,只去调用错误处理中间件。好比:
connect()
.use(mw1) // 出错
.use(mw2) // 跳过
.use(mw3) // 跳过
.use(errorHandler) // 执行
复制代码
参考
- 《Nodejs基础中间件Connect》
- 《Node.js实战(第2版)》