【问题标题】:Error handling in an inversify controller逆向控制器中的错误处理
【发布时间】:2019-07-26 19:06:59
【问题描述】:

我正在使用inversify-express-utils 包。

假设我有一个返回 User 实体的控制器操作:

  @httpGet("/:id")
  public async getUser(): Promise<User> {
    try {
      const id = this.httpContext.request.params.id;
      return await this._userRepository.get(id);
    }
    catch (e) {
      this.httpContext.response.status(404);
      // ...what goes here?
    }
  }

我知道我可以省略返回类型,但我不想绕过类型系统。

那么我从那个 catch 块返回什么?

【问题讨论】:

    标签: typescript inversifyjs


    【解决方案1】:

    如果你想重新抛出,你可以抛出任何你想要的,因为通常被拒绝的值没有正确输入(即any)。

    lib.es5.d.ts:

    interface Promise<T> {
        then<TResult1 = T, TResult2 = never>(
            onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
            // See `reason` below
            onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null
        ): Promise<TResult1 | TResult2>;
    

    有人可能会争辩说Promise 应该有两个泛型类型参数...

    如果你捕获并返回一个值,它必须是一个User 对象,如图所示。对我来说,点击 404 听起来更像是拒绝,但我不熟悉那个库,所以如果它不能正确处理拒绝,你可能必须返回一个值。

    如果不能拒绝的话,可能把返回类型改为User | null会更好,那么在失败的情况下可以返回null

    【讨论】:

    • 你的意思是return Promise.reject(); 吗?这会导致“未处理的拒绝”问题吗?
    • async 函数中,throw 将导致拒绝。这是否会导致问题取决于 express 和 inversify 如何处理路由处理程序中的拒绝,不幸的是我不知道,我只使用过 express(并且不多)。
    • 感谢您的建议!我想让这个开放一段时间,希望其他人也有这个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 2016-05-19
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多