【发布时间】:2020-11-15 15:38:57
【问题描述】:
我有一个简单的 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 块)?
【问题讨论】:
-
除了用
let在块外声明它以扩大其范围(我个人不会使用var)之外,没有解决这个问题的办法。这是一个常见问题,但没有很好的解决方案。 -
有时,您可以将所有想要使用该变量的代码放在
try {}块中,这样整个try/catch块之后就没有想要使用该变量的任何代码了。 -
能否请您发布整个函数的代码,尤其是在您想使用
userId变量的地方以及您在该catch块中还做了什么。 -
解决这个问题的另一种方法是将try/catch的一部分放在它自己的函数中,它返回一个存储为
const(或抛出)的值 -
@Joe - 虽然,这可能不会改变您仍然必须在该函数调用周围使用
try/catch的事实,并且可能仍然存在相同的问题,除非更多的代码使用的变量可以移到函数中。
标签: javascript node.js scope immutability