【问题标题】:TypeORM repository createQueryBuilder catches error but continues executionTypeORM 存储库 createQueryBuilder 捕获错误但继续执行
【发布时间】:2020-01-12 16:59:08
【问题描述】:
import { getCustomRepository } from "typeorm";
import { NextFunction, Request, Response } from "express";
import { UserRepository } from "../repositories/user-repository";

export class UserController {

  private userRepository = getCustomRepository(UserRepository);
  all = async (req: Request, res: Response, next: NextFunction) => {
    // return this.userRepository.find();
    let users = await this.userRepository
      .createQueryBuilder('users')
      .addSelect('users.passworda')
      .getMany()
      .catch(err => {
        console.log("Reached1");
        return next(err);
      })

    console.log("Reached2");
  }

}

我期望如果有异常并且只有 Reached1 被调用,则永远不会调用 Reached2。 但是 Reached1 和 Reached2 都被依次调用。 为了模拟数据库错误,我使用了密码 a 而不是密码数据库字段

【问题讨论】:

    标签: node.js typeorm


    【解决方案1】:

    如果getMany() 返回的承诺被拒绝(抛出异常),它会被捕获并调用next()

    .getMany()
    .catch(err => {
        console.log("Reached1");
        return next(err);
    });
    

    catch 本身返回的结果承诺已成功解决,因为之前已处理异常,结果值为undefined。所以let users 将保持undefined 并且代码继续执行到console.log("Reached2");


    以下代码将按照您的预期运行:

      all = async (req: Request, res: Response, next: NextFunction) => {
    
        try {
    
          let users = await this.userRepository
            .createQueryBuilder('users')
            .addSelect('users.passworda')
            .getMany();
    
          console.log("Reached2");
    
        } catch (err) {
          console.log("Reached1");
          return next(err);
        }
    
      }
    

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多