javascript - 在 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 块)?
解决方案
您没有显示要使用该变量的代码,因此很难为该特定代码提出具体建议,但这是 Javascript 中的常见问题,并且没有很好的解决方案。根据代码细节,您有时可以将想要使用该变量的其他代码移动到try
块内,使其在范围内。
如果这不可行,那么您必须按照您已经知道的那样做,即在块之前声明变量 withlet
或在块中声明它 with var
。我个人会避免var
。
您还可以将代码分解为一个函数(以及一些想要使用该变量的其他代码),该函数可以用您的值解析或拒绝,但这可能只会给您留下同样的问题(取决于其余的代码)。
PS你的catch
块通常不会有一个return
,所以你不会在之后继续执行try/catch
?如果您向我们展示整个请求处理程序,我们可以提出具体建议。
推荐阅读
- laravel - Laravel where 年龄条款
- gulp - 为什么 Gulp 两次运行相同的任务?
- ios - 在 IOS 应用程序中获取并显示外围蓝牙 RSSI 信号强度
- java - 将 Cucumber 集成到测试框架中?
- node.js - 通过 Express Validator 使用链验证来检查可选字段的存在
- python - 如何让 Conda 和 Virtualenv 在 mac OS Catalina 上工作?
- javascript - For循环无限运行
- c - 数据比 malloc 声明的大怎么办?
- spring - 无法将shell指向本地spring云数据流服务器?
- hadoop - 是否可以仅针对 reducer 任务增加容器大小?