在 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
之后继续执行吗?如果您向我们展示整个请求处理程序,我们可以提出具体建议。
我有一个简单的 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
之后继续执行吗?如果您向我们展示整个请求处理程序,我们可以提出具体建议。