Цель
Передайте 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 поддерживает модульную структуру, что способствует организации кода на больших проектах.
Как вы сказали, ваш код пытается прочитать значение из переменной, которая может быть undefined
.
Вы можете либо использовать условие, чтобы проверить, существует ли req.oidc.user
перед чтением из него, либо иметь необязательная цепочка, чтобы «замкнуть» выражение на undefined
, не вызывая ошибки.
Это ваш код с дополнительной цепочкой:
app.use((req, res, next) => {
res.locals.role = req.oidc.user?.['https://localhost:3000.com/roles'] ?? "null";
});
Примечание: я предлагаю не использовать "null"
в качестве значения по умолчанию. Возможно, используйте пустую строку (""
), которая также является ложное значение.