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回答
-
“math函数”是啥?
022022-02-05
相似问题