Объявление неизменяемой переменной в блоке try catch, которая доступна за пределами блока?

#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 блоке.