Node.js 在API上使用GET方法时,无法在将头发送到客户端后设置头
在我添加了用于授权和角色目的的中间件之后,我无法从受保护的端点获取数据 此路线负责获取所有即将到来的访问Node.js 在API上使用GET方法时,无法在将头发送到客户端后设置头,node.js,express,mongoose,callback,Node.js,Express,Mongoose,Callback,在我添加了用于授权和角色目的的中间件之后,我无法从受保护的端点获取数据 此路线负责获取所有即将到来的访问 router.get('/all', authorize, VisitController.getAllVisits); authorize是一个中间件,负责检查用户是否已登录并具有适当的角色: 当我首先通过邮递员通过super_admin角色调用Get on this endpoint时,我得到了这个错误(404未找到): 无法获取/api/visions/all 在服务器端,我得到:
router.get('/all', authorize, VisitController.getAllVisits);
authorize
是一个中间件,负责检查用户是否已登录并具有适当的角色:
当我首先通过邮递员通过super_admin
角色调用Get on this endpoint时,我得到了这个错误(404未找到):
无法获取/api/visions/all
在服务器端,我得到:
(node:5920) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (C:\Users\jan\Desktop\hairdresser-service\service-api\node_modules\express\lib\response.js:767:10)
at ServerResponse.send (C:\Users\jan\Desktop\hairdresser-service\service-api\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\Users\jan\Desktop\hairdresser-service\service-api\node_modules\express\lib\response.js:267:15)
at Visit.find.then.documents (C:\Users\jan\Desktop\hairdresser-service\service-api\controllers\visitController.js:127:28)
at process._tickCallback (internal/process/next_tick.js:68:7)
getallvisions
功能:
module.exports.getAllVisits = (req, res) => {
Visit.find().then(documents => {
return res.json({
message: 'Visits fetched successfully',
visits: documents
});
});
};
module.exports.verifyToken = (req, res, next) => {
const bearerHeader = req.headers['authorization']
if (typeof bearerHeader !== 'undefined') {
const bearer = bearerHeader.split(' ')
const bearerToken = bearer[1]
if(bearerToken == 'undefined' || bearerToken == '') {
res.json({
status: 403
})
}
req.token = bearerToken
next()
} else {
res.json({
status: 403
})
}
}
verifyToken
功能:
module.exports.getAllVisits = (req, res) => {
Visit.find().then(documents => {
return res.json({
message: 'Visits fetched successfully',
visits: documents
});
});
};
module.exports.verifyToken = (req, res, next) => {
const bearerHeader = req.headers['authorization']
if (typeof bearerHeader !== 'undefined') {
const bearer = bearerHeader.split(' ')
const bearerToken = bearer[1]
if(bearerToken == 'undefined' || bearerToken == '') {
res.json({
status: 403
})
}
req.token = bearerToken
next()
} else {
res.json({
status: 403
})
}
}
那么这里的问题是什么?有人说这是因为发送了很多响应,但我没有这样做。
ERR\u HTTP\u HEADERS\u SENT
告诉您要两次结束请求。发生这种情况是因为在模块.exports.authorize
中,您正在调用verifyToken
并忽略它正在结束请求或调用next
verifyToken
应与authorize
分开。一个简单的解决办法是出口一系列的中间产品
module.exports.authorize=[
验证令牌,
(请求、恢复、下一步)=>{
角色=['super_admin']
如果(角色类型==='string'){
角色=[角色];
}
常量角色=请求获取('role')
if(roles.length&&!roles.includes(role_)){
返回res.status(401.json)({message:'Unauthorized'});
}
next();
}
];
现在您的代码将首先调用,
verifyToken
,然后调用next
,它将转到检查角色的中间件。showverifyToken
@MarcosCasagrande立即添加