【问题标题】:Unable to set headers with cookie after sending json response发送 json 响应后无法使用 cookie 设置标头
【发布时间】:2020-06-14 02:21:36
【问题描述】:

使用 JWT 构建一些基本的登录功能,我在设置 cookie 时遇到了错误...错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头

据我所见,这是因为中间件进入下一个而不是结束前一个......我只是在将常量数据分配给 json 响应时尝试了 res.end(data)。有什么建议吗?

router.post('/users/login', async (req, res) => {
    try {
        let userInput = {
            email: req.body.email,
            password: req.body.password
        }
        const userCheck = await User.findOne({ email: req.body.email })
        if (!userCheck) {
            res.json("No User with that email!")
        } else {
            const valid = await bcrypt.compare(req.body.password, userCheck.password)
            if (!valid) {
                res.json("Invalid password for " + userCheck.email)
            } else {
                try {
                    const refreshToken = jsonwebtoken.sign({ userId: userCheck._id }, process.env.REFRESH_TOKEN_SECRET, { expiresIn: '7d' })
                    const accessToken = jsonwebtoken.sign({ userId: userCheck._id, }, process.env.ACCESS_TOKEN_SECRET, { expiresIn: '15m' })
                    res.json("AccessToken: " + accessToken)
                    res.cookie("bearer", refreshToken, {
                        httpOnly: true
                    })
                } catch (err) {
                    res.json("Error: " + err)
                }


            }
        }
    } catch (err) {
        res.status(400).json("Error: " + err)
    }
})

【问题讨论】:

    标签: node.js express jwt


    【解决方案1】:

    您只需要在使用res.json() 发送回复之前致电res.cookie()res.cookie() 设置响应的 cookie 标头,并且必须在发送响应之前就位。当您调用res.json() 时,所有已配置的标头都会随响应一起发送,您不能再设置更多标头,因为响应已经发送,您只能发送一个响应。

    所以,改变这个:

                try {
                    const refreshToken = jsonwebtoken.sign({ userId: userCheck._id }, process.env.REFRESH_TOKEN_SECRET, { expiresIn: '7d' })
                    const accessToken = jsonwebtoken.sign({ userId: userCheck._id, }, process.env.ACCESS_TOKEN_SECRET, { expiresIn: '15m' })
                    res.json("AccessToken: " + accessToken)
                    res.cookie("bearer", refreshToken, {
                        httpOnly: true
                    })
                } catch (err) {
                    res.json("Error: " + err)
                }
    

    到这里:

                try {
                    const refreshToken = jsonwebtoken.sign({ userId: userCheck._id }, process.env.REFRESH_TOKEN_SECRET, { expiresIn: '7d' })
                    const accessToken = jsonwebtoken.sign({ userId: userCheck._id, }, process.env.ACCESS_TOKEN_SECRET, { expiresIn: '15m' })
                    res.cookie("bearer", refreshToken, {   // <== This goes before res.json()
                        httpOnly: true
                    })
                    res.json("AccessToken: " + accessToken)
                } catch (err) {
                    res.json("Error: " + err)
                }
    

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多