我正在尝试开发一个装饰器来了解某些参数是否有效。
这是我的方法,
getUsers(offset, limit, orderBy, sort){
....
}
我需要检查 orderBy 是 'createdAt' 还是 'updatedAt' 如果不是,将发送一个 http 响应。
排序也是一样,它需要是“ASC”或“DESC”。
所以,我不知道如何使用装饰器来帮助我删除代码中的某些行,这是一个小块,但我认为它更干净。目前这是我要检查的块
if (!includes(this.orderByFields, orderBy)) {
return Utils.HttpError.badRequest(`You are allowed to order by [ ${this.orderByFields.join(', ')} ] only.`);
}
也许不可能做到,提前致谢:-)
你应该能够做这样的事情:
type ApiFunction = (offset: number, limit: number, orderBy: string, sort: string) => any;
const orderByFields = ["createdAt", "updatedAt"];
function validateRequest() {
return function(_target: any, _propertyName: string, descriptor: TypedPropertyDescriptor<ApiFunction>) {
const originalMethod = descriptor.value!;
descriptor.value = function(offset, limit, orderBy, sort) {
if (!orderByFields.includes(orderBy)) {
return "Bad Request";
}
return originalMethod.bind(this)(offset, limit, orderBy, sort);
};
};
}
这也确保您只能将装饰器应用于具有匹配签名的方法。
用法示例:
class Foo {
@validateRequest()
getUsers(offset: number, limit: number, orderBy: string, sort: string): string {
return "Result";
}
}
除此之外,您可能想尝试在类型级别强制执行orderBy
和sort
参数(如果您是此 API 的唯一使用者,那么您甚至可能不需要装饰器):
function getUsers(offset: number, limit: number, orderBy: "createdAt" | "updatedAt", sort: "ASC" | "DESC") {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句