如何解决在nodejs中使用输入参数创建Middlware
我想在nodejs中为访问级别创建一个错件,我创建了这个中间件:
class AccessUser extends middlware {
async AccessUser(access,req,res,next) {
const getTokenFrom = (req) => {
const authorization = req.headers["authorization"];
if (authorization && authorization.toLowerCase().startsWith("bearer ")) {
return authorization.substring(7);
}
return null;
};
const token = getTokenFrom(req);
if (token) {
jwt.verify(token,"shhhhh",(err,decoded) => {
if (err) return new ForbiddenResponse().Send(res);
let permission = decoded.info.permission;
let item = permission.find((x) => x.permissionId == access);
if (!item) {
return new ForbiddenResponse().Send(res);
} else {
next();
}
});
}
}
}
在此中间件软件中,我将参数名称access
添加到AccessUser
的输入中:
async AccessUser(access,next)
我想将access
与x.permissionId
进行比较。但它告诉我这个错误:
(节点:2168)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“授权”
此行的此错误:
const authorization = req.headers["authorization"];
我以此来使用这种中间件:
router.post(
"/Create",access.AccessUser("Role:Add")
);
现在出了什么问题?如何使用带有输入参数?????
的middllware解决方法
AccessUser
不是快速中间件,方法签名必须为(req,res,next)
。
如果将AccessUser
定义为工厂函数,则可以解决此问题(无需将其定义为异步,因为您无需等待任何异步调用):
class AccessUser {
accessUser(access) {
return function (req,next) {
const getTokenFrom = (req) => {
const authorization = req.headers["authorization"];
if (authorization && authorization.toLowerCase().startsWith("bearer ")) {
return authorization.substring(7);
}
return null;
};
const token = getTokenFrom(req);
if (token) {
jwt.verify(token,"shhhhh",(err,decoded) => {
if (err) return new ForbiddenResponse().Send(res);
let permission = decoded.info.permission;
let item = permission.find((x) => x.permissionId == access);
if (!item) {
return new ForbiddenResponse().Send(res);
} else {
next();
}
});
}// TODO: handle case if no token exists?
}
}
}
module.exports = AccessUser;
然后像这样使用它:
const AccessUserMiddleware = require('./path-to-access-middleware');
const AccessUser = new AccessUserMiddleware();
app.get('/',AccessUser.accessUser("Role:Add"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。