关于中间件只执行一次的问题

来源:6-2 中间件只在应用程序启动时初始化一次

泰格R

2019-10-12

这里有些困惑,在您课程中有段代码router.post('/register',new RegisterValidator(),async (ctx)=>{...}),讲到这时,您说到过:“如果以中间件的形式来写的话,它仅仅会在koa项目启动的时候new一次,并不会每次请求都new 一个新的实例”。


app/api/v1/classic.js 中引入了自定义中间件new Auth().m,既然中间件只会执行一次,这里引入自定义中间件后如果当前多个用户同时发起/latest请求,会导致中间件函数中const userToken = basicAuth(ctx.req)错乱吗?

router.get('/latest', new Auth().m, async (ctx, next) => {
    const flow = await Flow.findOne({
        order: [
            ['index', 'DESC']
        ]
    })
写回答

2回答

或许是鱼跃

2022-03-11

明白老师的意思了,只执行一次说的是多个/register请求进来而new RegisterValidator()被当做中间件只执行了一次,多个请求共用了实例化之后的属性,会导致属性值错乱的问题。

之所以new Auth().m为什么没这个问题是因为Auth类里get m()内部返回了一个匿名函数,虽然Auth只实例化了一次,Auth属性被共用了,但是m()函数内部每一次请求就会重新执行一遍,,所以没有类似的问题。

至于RegisterValidator类只实例化一次这个bug,也有其他的解决方式,下图我试了一下,可以避免老师说的bug,不过在写法上相比较在中间件内部重新实例化稍微麻烦一点(SingletonValidator相当于RegisterValidator)

//img.mukewang.com/szimg/622ac346099a0ede06310251.jpg

1
0

7七月

2019-10-12

new Auth().m 是每次请求实例化一个对象,怎么会错乱呢?

0
3
宝慕林24161
回复
7七月
那请问老师什么是静态的什么又是动态的
2021-07-11
共3条回复

Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》

理解异步编程本质/培养面向对象思维,独立完成Node.js服务端开发

2223 学习 · 878 问题

查看课程