首页 > 解决方案 > 我应该在 try-catch 块中编写所有路由处理代码吗?

问题描述

这是对 try...catch 的良好使用,还是应该将所有内容都写在 try 块中?我试图阻止嵌套的 try...catch 块。

    router.post('/refresh', async (req, res) => {
        const refreshToken = req.body.token;
        let decoded;

        try {
            decoded = jwt.verify(
                refreshToken,
                process.env.REFRESH_TOKEN_SECRET,
            );
        } catch(error) {
            return res.sendStatus(401);
        }

        // … use decoded variable here
    });

标签: javascriptnode.js

解决方案


你永远不需要嵌套try/catches- acatch()将捕获它下面的所有错误。

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch

具体来说:

try...catch 语句标记要尝试的语句块,并指定抛出异常时的响应。

但是,如果您不确定它refreshToken是否存在(这是不信任 Web 浏览器的一个很好的例子),您可以将它添加到您正在捕获错误的块中:

    router.post('/refresh', async (req, res) => {
        let decoded;

        try {
            const refreshToken = req?.body?.token;
            if ( ! token ) {
                 throw new Error('Token not supplied!')
            }
            decoded = jwt.verify(
                refreshToken,
                process.env.REFRESH_TOKEN_SECRET,
            );
        } catch(error) {
            return res.sendStatus(401);
        }

        // … use decoded variable here
    });

推荐阅读