【问题标题】:Node Returning Try Catch Nested Async Errors返回节点尝试捕获嵌套的异步错误
【发布时间】:2018-11-30 14:26:13
【问题描述】:

我创建了一个 nodejs/express api,它是另一个 api 的包装器。

我正在使用 try 和 catch 进行异步调用。我想知道在内部异步调用中是否捕获到错误是否会被外部异步调用捕获。

transaction.controller 是我的 api,它将 transaction.repository 调用到外部 api。函数 getTransactionResult 在 catch 部分抛出错误。但是,这不会循环回到我的 show 函数的 catch 部分。

router.ts

this.router.get('/:id', this.controller.show.bind(this.controller));

transaction.controller.ts

public async show(req: Request, res: Response): Promise<any> {

        const params = req.params;
        const token = req.headers.token;

        let transaction;

        try {
            transaction = await this.transactionRepo.getTransactionResult(params.id, token);

            console.log("instead carries on here"); // 2

            if (transaction.success === false) {
                return res.status(404).json({
                    success: false,
                    status: 404,
                    data: transaction,
                    message: "Failed to retrieve transaction result"
                });
            }

            return res.status(200).json({
                success: true,
                status: 200,
                data: transaction,
                message: "Successfully retrieved transaction result"
            });

        } catch (err) {

            //console.log("Does not call this");
            return res.status(500).json({
                success: false,
                status: 400,
                data: err,
                message: "The server threw an unexpected error",
            });
        }

transaction.repository.ts

public async getTransactionResult(transactionId: string, token: string) {

        const url = this.config.api_url + "/api/transactions/" + transactionId + "/summary";

        const options = {
            uri: url,
            headers: {
                'token': token
            },
            body: {

            },
            json: true,
            resolveWithFullResponse: true
        }


        let result;
        try {

            result = await request.get(options);

            if (result.statusCode !== 200) {
                return { "success": false, data: result }
            }

            return { "success": true, data: result }

        } catch (err) {
            console.log("CAUGHT ERROR"); // 1
            return err;
        }

    }

【问题讨论】:

  • 由于您在 getTransactionResult() 的 catch 块中处理错误,因此它不会传播到 show() 内部的外部异步调用。

标签: node.js express asynchronous async-await try-catch


【解决方案1】:

你需要重新throw错误不是return它。

通过return err 你是resolving Promise 这意味着异步操作成功。因此,为什么你在 transaction.controller.ts 中的 out try-catch 没有捕获任何东西。

要么:

  1. 不要抓住错误,让它冒泡

  2. Rethrow这个错误

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2018-04-20
    相关资源
    最近更新 更多