Я хочу проверить, что пользователь имеет роль, которая позволяет ему использовать конечную точку в моем API. Обычно я хотел бы сделать это, взяв userId, отправленный как часть JWT, и сделайте поиск в БД, чтобы увидеть роль пользователя. Это будет происходить внутри вызова API и будет выглядеть примерно так:Как получить доступ к db из промежуточного программного обеспечения node.js
var userId = getUserIdFromJwt();
app.models.User.findOne({_id: userId}, function (err, user) {
...check if user is in role...
});
Теперь я хочу, чтобы попытаться переместить этот код на кусок промежуточного слоя, который будет выглядеть следующим образом:
exports.isUserInRole = function(app, allowableRoles) {
var userId = getUserIdFromJwt();
app.models.User.findOne({_id: userId}, function (error, user) {
if (error) {
return res.status(500).json(error);
}
return function (req, res, next) {
if(_.includes(allowableRoles, user.Role)) {
next();
} else {
return res.status(401).json({"error": "User not in role"});
}
}
});
};
промежуточное программное обеспечение будет осуществляться следующим образом:
const allowableRoles = ['admin', 'implementor'];
app.get('/getStuff/', isUserInRole(app, allowableRoles), function (req, res) {
... do stuff if user is in role ...
});
в этот момент я бег в проблему, где значение app.models.User
всегда undefined
.
Я не понимаю, почему app.models.User
не определено в этот момент, поскольку я могу получить к нему доступ в анонимной функции внутри вызова get.
Как я могу получить доступ к БД из моего промежуточного программного обеспечения, если я не могу отправить его app.models.User
?
Для справки, я использую Mongoose и подвергая его моему приложению в server.js, из которого я обращаюсь к базе данных MongoDB.
Для того, чтобы это правильно понять, '' функция app.models.User' не определена в функции, вызываемой после 'isUserInRole' или во время? –
i.e является 'app.models.User.findOne' undefined? –
'app.models.User' не определено в момент, когда' isUserInRole' называется промежуточным программным обеспечением, но он доступен в следующей функции.Например, если я использую 'isUserInRole' как промежуточное программное обеспечение и называю его нормальной функцией в анонимной функции, то я вижу, что вызов db выполняется потому, что' app.models.User' не определен. – Ebbs