如何在装饰器中获取参数名称

小丑

我正在尝试开发一个装饰器来了解某些参数是否有效。

这是我的方法,

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";
  }
}

除此之外,您可能想尝试在类型级别强制执行orderBysort参数(如果您是此 API 的唯一使用者,那么您甚至可能不需要装饰器):

function getUsers(offset: number, limit: number, orderBy: "createdAt" | "updatedAt", sort: "ASC" | "DESC") {}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在装饰器中获取构造函数参数?

在装饰器中获取 Python 函数参数的名称

无法理解如何在装饰器内的包装函数中获取参数

如何在装饰器中比较更多参数?

如何在装饰器中获得Flask可选的URL参数?

如何在装饰器函数中打印函数默认参数?

Django - 如何在装饰器中访问请求正文?

如何在装饰器模式中处理“此”引用

如何在装饰器中捕获异常

如何在装饰器函数中访问类变量

如何获取在装饰器中调用装饰器的视图的URL?

如何仅在装饰器中处理* args和** kwargs并保持其他参数不变

如何在装饰器中访问ngStyle键和值?

如何在装饰器中捕获多个相同类型的异常

如何获取参数名称?

如何避免硬编码呢?在装饰器中

如何在运行时获取装饰器的名称?

如何在cgo导出的函数中获取正确的参数名称?

如何在运行时获取Java中的参数名称

如何在Delphi中获取方法参数名称数组/列表?

如何在Visual Studio Code 2019中获取位置参数名称

如何在不更改参数名称的情况下装饰Python函数?

如何在装饰器中使用上下文管理器以及如何将在装饰器中创建的对象传递给装饰函数

如何通过Kotlin中的反射获取参数名称?

如何获取传递到块中的参数名称?

在装饰器模式中,如何确保最低级别的元素不是装饰器?

如何在装饰器中注册其装饰的所有功能?

如何在 argparse 中要求完整的参数名称?

如何在快递路线中设置可选的参数名称?