装饰器
老师,你好。
import { GlobalErrorType } from '../error'
import { Controller } from 'egg'
/**
* 创建工厂函数接收 rules 和 errorType
* @param rules 验证规则
* @param errorType 错误类型
*/
export default function validateInput(rules: any, errorType: GlobalErrorType) {
/**
* @param _prototype 原型对象
* @param _key 属性名称
* @param descriptor 属性描述符
*/
return function(_prototype, _key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value // 获取属性对应的值(函数体)
// 重写被装饰的函数
descriptor.value = function(...args: any[]) {
const that = this as Controller
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const { ctx, app } = that
const error = app.validator.validate(rules, ctx.request.body)
if (error) {
return ctx.helper.error({ctx, errorType, error})
}
// 为什么这里不返回就会出问题?
return originalMethod.apply(this, args)
}
}
}
请问为什么不返回 originalMethod.apply(this, args) 就会出问题?
16
收起
正在回答
1回答
同学你好
因为 originalMethod.apply(this, args) 是原始方法真正的执行啊
如果不加这一行,那么被装饰的函数真正的函数体就不会执行,只会执行添加上去的装饰的一部分逻辑,这样就会出现问题。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星