请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

这里有些困惑,在您课程中有段代码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']
        ]
    })

正在回答 回答被采纳积分+3

2回答

或许是鱼跃 2022-03-11 11:36:10

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

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

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

https://img1.sycdn.imooc.com//szimg/622ac346099a0ede06310251.jpg

1 回复 有任何疑惑可以回复我~
7七月 2019-10-12 23:22:43

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

0 回复 有任何疑惑可以回复我~
  • 提问者 泰格R #1
    这里有些困惑,在您课程中有段代码router.post('/register',new RegisterValidator(),async (ctx)=>{...}),讲到这时,您说到过:“如果以中间件的形式来写的话,它仅仅会在koa项目启动的时候new一次,并不会每次请求都new 一个新的实例”
    回复 有任何疑惑可以回复我~ 2019-10-12 23:32:44
  • 7七月 回复 提问者 泰格R #2
    抱歉,我上面说错了,是的。所以new Auth()里面是静态的,静态的不涉及到状态。可以看下。
    回复 有任何疑惑可以回复我~ 2019-10-13 00:02:07
  • 那请问老师什么是静态的什么又是动态的
    回复 有任何疑惑可以回复我~ 2021-07-11 15:31:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信