Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在API上使用GET方法时,无法在将头发送到客户端后设置头_Node.js_Express_Mongoose_Callback - Fatal编程技术网

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
,它将转到检查角色的中间件。

show
verifyToken
@MarcosCasagrande立即添加