About middleware in express.js and connect

使用过express.js最大的体会就是中间件的使用。express.js本身功能极为精简,配合使用各种中间件却可以构建功能强大的web应用。
朴灵老师的《深入浅出nodejs》中也提到了中间件的实现,参考了connect的源码后,感觉可以自己实现一个比较简陋的支持中间件的http服务器。
connect的源码算上注释只有300行,阅读后感觉中间件实现的关键在next函数上,next函数是用来调用下一个中间件的,只有在上一个中间件中调用next函数下一个中间件才会被使用。

Example

Install
1
npm install julien-server
Usage
examplegithub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const path = require("path");
let Server = require("julien-server");
let bodyParser = require("body-parser");

let app = new Server();

// use body-parser middleware
app.use(bodyParser.urlencoded({
extended: false
}));

app.use(function (req, res, next){
req.name = "julien";
next();
})

app.use("/", function (req, res){
res.renderFile(path.resolve(__dirname, "./views/index.html"));
})

app.use("/user", function (req, res){
res.end(req.name);
})

app.use("/download", function (req, res){
res.sendFile(path.resolve(__dirname, "./views/index.html"));
})

app.use("/query", function (req, res){
res.write(JSON.stringify({
query: req.query
}));
res.end();
})

app.use("/post", function (req, res){
// req.body is set by body-parser middleware
console.log(req.body);
res.end("handle post")
})

// throw error in middleware
app.use("/error",function (req, res, next){
next(new Error("this is an error"));
})


// add error handle middleware
app.use(function (error, req, res, next){
res.end("custom error handle");
})

app.listen(8000);

自身写了两个中间件,一个处理query参数的,一个发送文件。body-parser中间件在connect和express.js中经常使用,用来从请求体中提取数据,目前也可以正常使用。