节点:使用嵌套的async / await try / catch

时间:2018-04-21 14:15:26

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

我无法弄清楚如何从生成的错误中正确发送Express路由器处理程序响应并在嵌套的try / catch块中捕获。

在下面的代码中,如果内部 Try / Catch 3 块捕获错误,我希望路由处理程序的所有执行都停止,这将返回状态404错误。此时,当 Try / Catch 3 中发现错误时,路由处理程序继续执行代码块A 中的后续代码,捕获并返回状态尝试/抓住1 中有400 错误。路线hanlder然后发送此 400状态响应。如何让路由处理程序返回 Try / Catch Block 3 404响应,因此,永远不会执行代码块A 中的代码?

我尝试在各个地方修改return语句,但似乎无法让路由处理程序单独返回内部 Try / Catch 3 中捕获的错误。任何人都可以相对轻松地看到我无法正确返回或管理错误传播的地方吗?

app.get("/endpoint/url", async(req, res) => {
    // Try/Catch 1
    try {

        // Define an async function
        const queryApiFunc = async() => {
            // Try/Catch 3
            try {
                let results = await axios({
                    // Axios Query to API
                })
                if (/*condition is met*/) 
                    throw "No results found";

                }
            catch (e) {
                if (e === "No results found") {
                    res.statusMessage = e;
                    return res.status(404).end();;
                }
            }
        }

        // Try/Catch 2
        try {
            // Call the defined async function
            await queryApiFunc();
        } catch (e) {
            return e;
        }

        // Code Block A 
        // contains another async call to API 
        // generates 400 status error
        // Code Block A

    } catch (e) {
        return e;
    }
}

1 个答案:

答案 0 :(得分:2)

似乎发生了这种情况,因为你实际上并没有从函数中抛出任何东西。我并不完全确定你要完成的是什么,但是结构更像是以下内容呢?

app.get("/endpoint/url", async(req, res) => {
    const queryApiFunc = async() => {
        let results = await axios({

        });
        if (/*condition is met*/) throw "No results found";
    };

    try {
        await queryApiFunc();
        //Code Block A
    } catch (e) {
        if (e === "No results found") {
            res.statusMessage = e;
            return res.status(404).end();;
        }
    }
});

这应该摆脱一些try / catch陷阱,你可能会吞咽错误,然后让你达到实际的预期结果。