首页 > 解决方案 > 在 try catch 块中声明不可变变量,可以在块外访问?

问题描述

我有一个简单的 try catch 块,它尝试授权用户并将 usedId 设置为解码令牌中的相关属性,如下所示:

let userId;
try {
    const decodedIdToken = await validateIdToken(request);
    userId = decodedIdToken.user_id;
} catch (error) {
    response.status(403).send(error);
    return;
}

const question = {
        author: userId,
        text: request.body.text,
        tags: request.body.tags,
    }

虽然这可行,但 userId 变量的可变性让我感到困扰,因为它可能会尝试在其他地方使用它并发现它是未定义的,因为我们在最初声明时没有给它任何值。如果我没有在 try 块之外使用 let 声明它,即我在块内使用 const 声明它,从而使其不可变,它的作用域是 try 块并且不能在其他地方使用。

一种选择是在 try 块中使用 var 来提升它,但这又是可变的,并且提升有其自身的潜在缺陷,所以我不想使用它。

是否有一种普遍接受的模式来声明这样的变量,设置值的调用可能会失败(需要 try catch 块)?

标签: javascriptnode.jsscopeimmutability

解决方案


您没有显示要使用该变量的代码,因此很难为该特定代码提出具体建议,但这是 Javascript 中的常见问题,并且没有很好的解决方案。根据代码细节,您有时可以将想要使用该变量的其他代码移动到try块内,使其在范围内。

如果这不可行,那么您必须按照您已经知道的那样做,即在块之前声明变量 withlet或在块中声明它 with var。我个人会避免var

您还可以将代码分解为一个函数(以及一些想要使用该变量的其他代码),该函数可以用您的值解析或拒绝,但这可能只会给您留下同样的问题(取决于其余的代码)。

PS你的catch块通常不会有一个return,所以你不会在之后继续执行try/catch?如果您向我们展示整个请求处理程序,我们可以提出具体建议。


推荐阅读