NodeJS中间件的通俗理解

发布日期 目录 NodeJS, 后端知识

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个打印')
})

发表评论

邮箱地址不会被公开。