需要将中间件放在请求之前,是因为没有加next(),app.get()里面的回调也是中间件,老师的功课没有做好哦,如下也是正常运行的

来源:6-3 express基础概念讲解

慕粉3643360

2020-04-10

app.use(’/api’,(req,res,next)=>{
console.log(‘处理/api 路由’)
next()
})

app.get(’/api’,(req,res,next)=>{
console.log(‘get处理/api 路由’)
next()
})
app.listen(8080,()=>{
console.log(‘server is running on port 8080’)
})

写回答

1回答

Sam

2020-04-10

你好,非常感谢你给课程提供改进建议,确实如你所说,next 回调方法可以继续执行下一个 handler,看下官方对 next 方法的解释如下:

In fact, the routing methods can have more than one callback function as arguments. With multiple callback functions, it is important to provide next as an argument to the callback function and then call next() within the body of the function to hand off control to the next callback.

这段话的意思是当存在多个控制器命中时,会通过 next 方法将执行权交给下一个控制器,下面给出一个案例:

app.use(function(req, res, next) {
  console.log('this is middleway')
  next()
}) // 控制器1

app.get('/', function(req, res, next) {
  console.log('do something...')
  next()
}) // 控制器2

app.get('/', function(req, res) {
  res.send('hello world!')
}) // 控制器3

当我们访问 / 路由时,执行顺序如下:

  1. 执行第一个控制器,这是一个中间件,所以会打印出 this is middleway,然后继续执行下一个控制器

  2. 执行第二个控制器,因为路由 / 命中了该控制器,该控制器会打印 do something,然后继续执行下一个控制器

  3. 执行第三个控制器,因为路由 / 命中了该控制器,该控制器会返回 hello world!,此时客户端会接收到上述文本,执行结束

express 这样设计的目的是因为两点:

  1. 存在多个命中的控制器,如上述案例中,访问路由 / 会命中 3 个控制器

  2. 控制器中的处理方法是一个回调函数(即第二个参数),如何控制回调函数的顺序,是通过 next 方法来协调的,这样的好处是当回调函数中继续存在异步时,我们通过 next 仍然可以继续执行下一个控制器

0
0

Vue Element+Node.js开发企业通用管理后台系统

基于Element的中后台课程,一套中小型企业通用的后台管理系统

2829 学习 · 1716 问题

查看课程