NodeJS中间件的通俗理解
必须输入->中间件处理->必须输出
必须输入->中间件处理->流入下一个中间件处理->必须只能有一个输出
中间件是通过路由地址匹配进入的:/home
app.use('/home',(req,res,next)=>{
console.log('第一个打印',req.url);
res.send('output1111....')
console.log('第2个打印')
})
如果中间件没有匹配路由,也就是第一个参数为空,则代表全部路由
app.use((req,res,next)=>{
console.log('第一个打印',req.url);
res.send('output1111....')
console.log('第2个打印')
})
next方法作用是流入下一个中间件
// 当前中间件
app.use('/home1',(req,res,next)=>{
console.log('第1个打印',req.url);
next();
console.log('第4个打印')
})
// 下一个中间件
app.use((req,res,next)=>{
console.log('第2个打印',req.url);
res.send('output1111....')
console.log('第3个打印')
})
如果进入到一个中间件,但是当前中间件没有流入下一个中间件,且当前中间没有返回数据,则页面一直转圈,相当于客户端一直在等待服务器的响应
app.use((req,res,next)=>{
console.log('第一个打印',req.url);
console.log('第2个打印')
// 中间件没有输出内容,也没有流入下一个中间件,相当于服务器没有响应
})
如果进入到一个中间件,但是当前中间件没有流入下一个中间,但当前中间件返回了数据,则不会进入其他的中间件
// 当前中间件返回了数据
app.use((req,res,next)=>{
console.log('第一个打印',req.url);
res.send('output1111....')
console.log('第2个打印')
})
// 下一个中间件,没有流入进来
app.use((req,res,next)=>{
console.log('该行不打印',req.url);
res.send('output1111....')
console.log('该行不打印')
})
如果进入到一个中间件,但是流入了下一个中间件,且下一个中间件没有返回数据,但是第一个中间件返回了数据,则正常
// 当前中间件
app.use('/home1',(req,res,next)=>{
console.log('第1个打印',req.url);
next();
res.send('output1111....')
console.log('第4个打印')
})
// 下一个中间件
app.use((req,res,next)=>{
console.log('第2个打印',req.url);
console.log('第3个打印')
})
如果进入到一个中间件,但是当前中间件没有返回数据,但流入的下一个中间件返回了数据,正常
// 当前中间件
app.use('/home1',(req,res,next)=>{
console.log('第1个打印',req.url);
next();
console.log('第4个打印')
})
// 下一个中间件
app.use((req,res,next)=>{
console.log('第2个打印',req.url);
res.send('output1111....')
console.log('第3个打印')
})
如果进入到一个中间件,但是当前中间件与下一个中间件都返回了数据,则报错:Error: Can't set headers after they are sent
// 当前中间件
app.use('/home1',(req,res,next)=>{
console.log('第1个打印',req.url);
next();
res.send('output1111....');// 执行到这里报错:Error: Can't set headers after they are sent
console.log('上面报错,导致这个不打印')
})
// 下一个中间件
app.use((req,res,next)=>{
console.log('第2个打印',req.url);
res.send('output1111....')
console.log('第3个打印')
})