前言
目前用的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控制器中的装饰器执行顺序与装饰器所在顺序无关,而是按照生命周期顺序来的,但是如果是在同一个生命周期中的装饰器,(说不定)就会按照装饰器所在顺序执行了。
评论