创建 Connect 程序
$ npm install connect@3.4.0
//server.js
const app = require('connect')();
app.use((req,res,next)=>{
res.end('Hello ,Connect!');
});
app.listen(3000);
了解 Connect 中间件的工作机制
Connect 中间件就是 JavaScript 函数。这个函数一般会有三个参数:请求对象、响应对象,以及一个名为 next 的回调函数。一个中间件完成自己的工作,要执行后续的中间件时,可以调用这个回调函数。
在中间件运行之前, Connect 会用分派器接管请求对象,然后交给程序中的第一个中间件。下图图是一个典型的 Connect 程序的示意图,由分派器和一组中间件组成,这些中间件包括日志记录、消息体解析器、静态文件服务器和定制中间件。
组合中间件
const connect = require('connect');
function logger(req,res,next){
console.log('%s %s',req.method,req.url);
next();
}
function hello(req,res){
res.setHeader('Content-Type','text/plain');
res.end('hello connect');
}
connect()
.use(logger)
.use(hello)
.listen(3000);
中间件的顺序
中间件的顺序会对程序的行为产生显著影响。漏掉 next()能停止执行,也可以通过组合中间件实现用户认证之类的功能。
创建可配置的中间件
为了做到可配置,中间件一般会遵循一个简单的惯例:用一个函数返回另一个函数(闭包)。
function setup(options) {
// 设置逻辑
//在这里做中间件的初始化
return function(req, res, next) {
// 中间件逻辑
//即使被外部函数返回了,仍可以访问options
}
}
//用法
app.use(setup({some:'options'}));
在实际工作中,可配置的中间件跟之前创建的不可配置中间件用起来是一样的,只是可以向其中传入额外的参数来改变它的行为。可配置中间件的使用和下面这个例子差不多, logger 能接收一个字符串参数,描述输出的日志格式:
const app = connect()
.use(logger(':method :url'))
.use(hello);
为了让 logger 可配置,需要先定义一个 setup 函数,它能接受一个字符串参数(此例中名为 format)。 setup 的返回结果是一个函数,即 Connect 所用的中间件。即便被 setup 返回后,这个中间件函数仍能访问 format,因为它们是在同一个 JavaScript 闭包内定义的。 logger会将 format 中的标记替换为 req 对象中的相应属性,输出到控制台,然后调用 next()。
function setup(format) {//setup 函数可以用不同的配置调用多次
const regexp = /:(\w+)/g;//logger 组件用正则表达式匹配请求属性
return function createLogger(req, res, next) {
//Connect 使用的真实 logger 组件
const str = format.replace(regexp, (match, property) => {
return req[property];//用正则表达式格式化请求的日志条目
});
console.log(str);//将日志条目输出到控制台
next();//将控制权交给下一个中间件组件
}
}
module.exports = setup;//直接导出logger的setup函数