前言

目前用的nestjs里面有许多的装饰器,一层套一层,如路由装饰器,参数校验装饰器,权限校验装饰器,登录校验装饰器等等。之前也没怎么想过给装饰器列个先后,而且之前也一直认为装饰器是由外而内的,那么现在就来写个例子实际验证一下装饰器的顺序

验证

function d1() {
    console.log('d1 wrapper');
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        console.log("d1");
    };
}
function d2() {
    console.log('d2 wrapper');
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        console.log("d2");
    };
}
class Test {
    @d1()
    @d2()
    test() {
        console.log('test');
    }
}
console.log(new Test().test());

输出

d1 wrapper
d2 wrapper
d2
d1
test

总结

由此可见装饰器是用的洋葱模型,先由外而内,再由内而外。我之前的认知中外层是对的,但是没想到内层是由内而外的。

至此,那可以按照内层执行顺序给nestjs的装饰器排一下序,路由装饰器在最底部,先进入路由;接着是登录校验装饰器,登录后才是权限校验装饰器,权限没毛病才是用参数校验装饰器校验等等。

但是nestjs控制器中的装饰器执行顺序与装饰器所在顺序无关,而是按照生命周期顺序来的,但是如果是在同一个生命周期中的装饰器,(说不定)就会按照装饰器所在顺序执行了。

评论

0 / 800
全部评论()