like-express.js中match方法对this.routes.all和this.routes[method]的直接拼接不正确

来源:10-16 中间件原理-代码实现

慕设计9081129

2022-02-04

app.use(url, fn) 和 app.get(url, fn) 对url的匹配规则不同。app.use从左到右匹配一部分即可,app.get需要全部匹配。写了个例子验证:

const express = require('express')
const app = express()

app.use((req, res, next) => {
  console.log(1)
  next()
})

app.get((req, res, next) => {
  console.log(2)
  next()
})

app.use('/api', (req, res, next) => {
  console.log(3)
  next()
})

app.get('/api', (req, res, next) => {
  console.log(4)
  next()
})

app.get('/api/get-cookie', (req, res, next) => {
  console.log(5)
  res.json({
    errno: 0,
    data: req.cookie
  })
})

app.listen(3001, () => {
  console.log('server is running on port 3001.')
})

执行http://localhost:3001/api/get-cookie,控制台打印了1,3,5 。没有打印出4。

综上,由于url的匹配规则不同,老师的like-express.js中,不能像下面这样直接拼出当前路由curRoutes。this.routes.all 和 this.routes[method]要分开处理。

let curRoutes = []
curRoutes = curRoutes.concat(this.routes.all)
curRoutes = curRoutes.concat(this.routes[method])
// 对curRoutes的集中处理
curRoutes.forEach(routeInfo => {
	// 省略
})

分开处理才是正确的:

    this.routes.all.forEach(routeInfo => {
      if(routeInfo.path === '/' || routeInfo.path.indexOf(url + '/') === 0){
        stack = stack.concat(routeInfo.stack)
      }
    })

    this.routes[method].forEach(routeInfo => {
      if(routeInfo.path === url) {
        stack = stack.concat(routeInfo.stack)
      }
    })
写回答

1回答

双越

2022-02-05

“math函数”是啥?

0
2
双越
回复
慕设计9081129
感谢反馈哈~
2022-02-05
共2条回复

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程