在 try catch 块中声明可在块外访问的不可变变量?

Declaring immutable variable in try catch block, that is accessible outside the block?

我有一个简单的 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 变量的可变性困扰着我,因为可能会尝试在其他地方使用它并发现它是未定义的,因为我们在最初声明时没有给它任何值。如果我不使用 let 在 try 块外声明它,即我在块内使用 const 声明它并因此使其不可变,则它的范围仅限于 try 块并且不能在其他地方使用。

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

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

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

如果那不可行,那么你必须按照你已经知道的那样做,即在块之前用 let 声明变量,或者在块内用 var 声明变量。我个人会避免 var.

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

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