javascript 如何使用Angular修复NodeAPI中已发送到客户端的报头

r6l8ljro  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(129)

我在我的节点api上得到了下面的错误,这实际上只是控制台在这一点上记录请求。

router.get('/booksByISBN', checkRole, async (req, res) => {
        console.log(req.params)
        return res.sendStatus(200);
    });
node:internal/errors:484
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

我相信这个问题是因为飞行前的CORS数据,但没有线索如何解决它。
在我的Angular 15应用程序中有一个API调用,但在检查Network选项卡时,我看到实际上有两个API调用正在对我的端点进行。

我知道这是因为CORS选项请求,但我不知道如何修复它,让API通过。
CheckRole函数

var checkRole = async function CheckRoleAuth (req, res, next) {
        try {
            const token = req.headers.authorization.split(' ')[1];
            const decodedToken = jwt.verify(token, envs.jwtSecret);
    
            await User.findById(decodedToken.userId)
                .then(foundUser => {
                    if (foundUser) {
                        if (foundUser.role != null || foundUser.role != '') {
                            if (foundUser.role.includes('Admin'))
                            {
                                req.userData = {
                                    email: decodedToken.email,
                                    id: decodedToken.id
                                };
                                next();
                            } else {
                                return res.sendStatus(401);
                            }
                        } else {
                            return res.sendStatus(401);
                        }
                    }
                })
                .catch(err => {
                    return res.sendStatus(401);
                });
    
        } catch (error) {
            return res.sendStatus(401);
        }
    }
sdnqo3pr

sdnqo3pr1#

您在checkRole中间件中将async/awaitthen/catch组合在一起,因此可能checkRole中间件和端点处理程序都试图发回响应。
像这样重构checkRole中间件:

const checkRole = async function CheckRoleAuth(req, res, next) {
  try {
    const token = req.headers.authorization.split(' ')[1];
    const decodedToken = jwt.verify(token, envs.jwtSecret);

    const user = await User.findById(decodedToken.userId).lean();

    if (!user) return res.sendStatus(401);

    if (!user?.role?.includes('Admin')) return res.sendStatus(403);

    req.userData = { email: decodedToken.email, id: decodedToken.id };
    next();
  } catch (error) {
    return res.sendStatus(401);
  }
};

相关问题