关于中间件只执行一次的问题
来源: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)
10 -
7七月
2019-10-12
new Auth().m 是每次请求实例化一个对象,怎么会错乱呢?
032021-07-11
相似问题