【问题标题】:Declaring immutable variable in try catch block, that is accessible outside the block?在 try catch 块中声明不可变变量,可以在块外访问?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 为简洁起见对示例代码进行了编辑,但您是对的,我不应该排除 catch 块中的 return 语句。
猜你喜欢
  • 2013-02-08
  • 2014-06-23
  • 2015-01-26
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多