尝试将令牌合并到注册中

Trying To Incorporate Tokens Into Sign Up

我正在尝试在用户注册我的应用程序时从 JWT 创建令牌,但出现错误,错误 [ERR_HTTP_HEADERS_SENT]:无法在之后设置 headers它们被发送到客户端。我认为我的代码结构存在问题。我该如何解决这个问题?

//sign up request
exports.signup = async (req, res, next)=> {
    
    const {email} = req.body;
    const userExist = await User.findOne({email});

    if (userExist) {
        return next(new ErrorResponse(`Email already exists`, 404))
    }

    
    try {
        const user = await User.create(req.body);
        res.status(201).json({
            success: true,
            user
        })

        generateToken(user, 201, res);


    } catch (error) {
       console.log(error);
       next(error);
    }
}

//generate token method
const generateToken = async (user, statusCode, res) => {
    const token = await user.jwtGenerateToken();
    var hour = 3600000;
    const options = {
        httpOnly: true,
        expires: new Date(Date.now() + hour)
    };
    res.status(statusCode)
    .cookie('token', token, options)
    .json({success: true, token})
}

您正在尝试发送两次响应。然后在 generateToken 方法中。把它放在一个地方,错误就会消失。

首先生成令牌,然后发送响应

 generateToken(user, 201, res);

 res.status(201).json({
            success: true,
            user
        })

您可以 return 来自令牌的值,然后使用响应发送它,或者您可以只从 generateToken 函数发送它。在这里你试图再次使用响应,尽管你已经发送了一次因此导致错误。

已更新

//注册请求

exports.signup = async (req, res, next)=> {
        
    const {email} = req.body;
    const userExist = await User.findOne({email});

    if (userExist) {
        return next(new ErrorResponse(`Email already exists`, 404))
    }

    
    try {
        const user = await User.create(req.body);
        generateToken(user, 201, res);


    } catch (error) {
       console.log(error);
       next(error);
    }
}

//generate token method
const generateToken = async (user, statusCode, res) => {
    const token = await user.jwtGenerateToken();
    var hour = 3600000;
    const options = {
        httpOnly: true,
        expires: new Date(Date.now() + hour)
    };
    res.status(statusCode)
        .cookie('token', token, options)
        .json({success: true, token: token, user: user})
}