#javascript #node.js #scope #immutability
#javascript #node.js #область видимости #неизменность
Вопрос:
У меня есть простой блок 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 и не может быть использована в другом месте.
Один из вариантов — использовать var внутри блока try для его подъема, но опять же, это изменчиво, и подъем сопряжен со своими потенциальными подводными камнями, поэтому я предпочитаю не использовать его.
Существует ли общепринятый шаблон для объявления таких переменных, когда вызов, устанавливающий значение, может завершиться неудачей (что требует блока try catch)?
Комментарии:
1. Нет другого решения этой проблемы, кроме объявления ее вне блока с
let
помощью расширения ее области действия (я бы не стал использоватьvar
лично). Это распространенная проблема, но у нее нет хорошего решения.2. Иногда вы можете поместить весь код, который хочет использовать переменную внутри
try {}
блока, так что после всегоtry/catch
блока не останется ничего, что хотело бы использовать переменную.3. Не могли бы вы опубликовать код всей функции, особенно там, где вы хотите использовать
userId
переменную, и что еще вы делаете в этомcatch
блоке.4. Другой способ решить эту проблему — использовать часть try / catch в своей собственной функции, которая возвращает значение, которое сохраняется как
const
(или выдает)5. @Joe — Хотя, это, вероятно, не меняет того факта, что вам все равно придется использовать
try/catch
этот вызов функции и, вероятно, все равно будет иметь ту же проблему, если больше кода, использующего переменную, не может быть перемещено в функцию.
Ответ №1:
Вы не показываете код, который хочет использовать переменную, поэтому сложно дать конкретную рекомендацию для этого конкретного кода, но это распространенная проблема в Javascript, и хорошего решения нет. В зависимости от специфики кода, иногда вы можете переместить другой код, который хочет использовать переменную, внутрь try
блока, чтобы она была в области видимости.
Если это невозможно, то вам нужно поступить так, как вы уже знаете, то есть объявить переменную перед блоком with let
или объявить ее внутри блока with var
. Я лично избегал var
бы .
Вы также можете разложить код на функцию (с некоторым другим кодом, который хочет использовать переменную), которая либо разрешает с вашим значением, либо отклоняет, но это может просто оставить вас с той же проблемой (в зависимости от остальной части кода).
PS Разве в вашем catch
блоке обычно не было бы a return
, чтобы вы не продолжали выполнение после try/catch
? Если вы покажете нам весь обработчик запроса, мы сможем дать конкретные рекомендации.
Комментарии:
1. Пример кода отредактирован для краткости, но вы правы, я не должен был исключать оператор return в
catch
блоке.