模型介绍
express模块使用下面的方式通信:
app.get('/',(req,res,next)=>{
// Handle req and res
next(); // or res.end();
})
它主要是用一种“回调函数接力”的形式处理客户请求。
这些回调函数被称为“中间件(middleware)”
比如:
app.get('/*',(req,res,next)=>{
console.log(req.path);
next(); // or res.end();
})
app.get('/hi',(req,res,next)=>{
res.send("Hello world!");
})
这时当你访问/hi时/*先被匹配,/hi将被先输出在控制台中
紧接着由于next()被调用,/hi被匹配,于是客户的浏览器中会出现Hello world
要点
[sc name="quote-black" ]在函数接力过程中,req,res是不会被重置的。这也给第三方插件的开发提供了广阔的空间。[/sc]
比如当我们收到post请求时,我们通常不想自己把body的字符串转换成js object,因为通信协议首先有很多,还在随时代进步更新。自己写的话会增加维护成本。这时我们就可以用body-parser提供的回调函数帮我们处理req的body部分。
let bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }));
app.post('/hi',(req,res,next)=>{
res.send(JSON.stringify(req.body));
})
上面的代码首先在接收到用户的请求时body-parser函数会先处理req,并把结果挂在req.body上,不难猜到在body-parser的实现中最后一行调用了next(),于是我们自己写的函数就运行了。