Установка значения по умолчанию для глобальной переменной, если она не определена

Цель

Передайте role (e.g. admin) из user всем моим view templates без необходимости делать это в каждом отдельном маршруте.

Что я пытаюсь

Добавление ролей пользователей (называемых с помощью req.oidc.user...) в виде res.local в app.js.

Код (приложение.js)

app.use((req, res, next) => {
  res.locals.role = req.oidc.user['https://localhost:3000.com/roles'] ?? "null"
})

Проблема

Я надеялся, что ?? "null" добавит значение «null» к ролям, когда пользователь не вошел в систему, чтобы я мог обрабатывать условную логику в шаблонах с помощью

'if !role === 'admin' do x. 

Вместо этого я просто получаю сообщение об ошибке Cannot read properties of undefined (reading 'https://localhost:3000.com/roles') (понятно, поскольку там ничего нет, когда я не вошел в систему!)

Есть ли лучший способ передать значения, которые будут неопределенными до тех пор, пока пользователь не войдет в мои представления, не выполняя нижеследующее в каждом отдельном маршруте в (controller.js):

index = (req, res) => {
  res.render("index", {
    role: req.oidc.user['https://localhost:3000.com/roles'],
  });
};

🤔 А знаете ли вы, что...
JavaScript поддерживает модульную структуру, что способствует организации кода на больших проектах.


1
36
1

Ответ:

Решено

Как вы сказали, ваш код пытается прочитать значение из переменной, которая может быть undefined.

Вы можете либо использовать условие, чтобы проверить, существует ли req.oidc.user перед чтением из него, либо иметь необязательная цепочка, чтобы «замкнуть» выражение на undefined, не вызывая ошибки.

Это ваш код с дополнительной цепочкой:

app.use((req, res, next) => {
    res.locals.role = req.oidc.user?.['https://localhost:3000.com/roles'] ?? "null";
});

Примечание: я предлагаю не использовать "null" в качестве значения по умолчанию. Возможно, используйте пустую строку (""), которая также является ложное значение.