【问题标题】:I am getting this error : Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client我收到此错误:错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头
【发布时间】:2020-08-26 23:19:10
【问题描述】:

当我发送 POST 登录请求时,显示此错误。我用过猫鼬和 MongoDB Atlas。

如果我使用有效的电子邮件和密码发送 POST 请求,它也会显示此错误。

错误 [ERR_HTTP_HEADERS_SENT]:发送后无法设置标头 给客户

但是 POST 注册请求运行良好。

用户模型

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const userSchema = new Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
    email: {
        type: String,
        required: true,
    },
    password: {
        type: String,
        required: true
    }, 
    balance: Number,
    income: Number,
    expense: Number,
    transactions: {
        type: [{
            type: Schema.Types.ObjectId,
            ref: 'Transaction'
        }]
    }
})

const User = mongoose.model('User', userSchema)
module.exports = User

用户控制器

const registorValidate = require('../validator/registrationValidate')
const User = require('../models/userModel')
const bcrypt = require('bcrypt')
const loginValidate = require('../validator/loginValidator')
const jwt = require('jsonwebtoken')

module.exports = {
    login: (req, res) => {
        const { email, password } = req.body
        let logValidate = loginValidate({ email, password })

        if (!logValidate.isValid) {
            res.status(400).json(logValidate.error)
            return
        }

        User.findOne({ email })
            .then(user => {
                if (!user) {
                    console.log(`${email} not found`)
                    res.json({
                        msg: `${email} not found`
                    })
                }
                bcrypt.compare(password, user.password, (err, result) => {
                    if (err) {
                        res.status(400).json({
                            msg: 'Error occured'
                        })
                    }
                    if (!result) {
                        res.status(404).json({
                            msg: `Password doesn't match`
                        })
                    }
                    let token = jwt.sign({
                        _id: user._id,
                        name: user.name,
                        email: user.email
                    }, 'SECRET', { expiresIn: '2h' })

                    res.status(200).json({
                        msg: 'Login successful',
                        token: `Bearer ${token}`
                    })

                })
                return
            })
            .catch(err => {
                res.status(500).json({
                    msg: 'Error occured'
                })
            })

        res.end()

    },
    registration: (req, res) => {
        let { name, email, password, confirmPassword } = req.body
        let validate = registorValidate({ name, email, password, confirmPassword })

        if (!validate.isValid) {
            res.status(400).json(validate.error)
        } else {
            User.findOne({ email })
                .then(user => {
                    if (user) {
                        res.json({
                            msg: `${email} is already exist`
                        })
                    } else {
                        bcrypt.hash(password, 11, (err, hash) => {
                            if (err) {
                                res.status(500).json({
                                    msg: 'Server error occured'
                                })
                            }
                            let user = new User({
                                name,
                                email,
                                password: hash
                            })
                            user.save()
                                .then(user => {
                                    res.status(201).json({
                                        msg: `Thanks ${name} for your registration`,
                                        user
                                    })
                                })
                                .catch(err => {
                                    res.status(500).json({
                                        msg: 'Error occured'
                                    })
                                })
                        })
                    }
                })
                .catch(err => {
                    res.status(500).json({
                        msg: 'Error occured'
                    })
                })
        }
    }
}

登录验证器

const validator = require('validator')

const validate = user => {
    let error = {}

    // Email validator
    if (!user.email) {
        error.email = 'Please provide an Email'
    } else if (!validator.isEmail(user.email)) {
        error.email = 'Please provide a valid Email'
    }

    // Password validate
    if (!user.password) {
        error.password = 'Please provide a password'
    } else if (user.password.length < 6) {
        error.password = 'Password Must be greater or Equal to 6 characters'
    }

    return {
        error,
        isValid: Object.keys(error).length === 0
    }
}

module.exports = validate

谢谢。

【问题讨论】:

    标签: mongodb express mongoose mongoose-schema


    【解决方案1】:

    您不需要输入res.end(),因为当您之前调用res.json() 时,它已经发送了响应。

    请注意,当您调用res.end()res.send()、'res.json()' 和其他发送响应的操作时,您应该return,就像您对res.status(400).json(logValidate.error)所做的一样

    这应该是阻止您获得ERR_HTTP_HEADERS_SENT 的方法之一,但请记住,如果您有嵌套的回调,您也应该从外部范围return

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2020-11-01
    • 2020-09-22
    • 2020-05-26
    • 2018-09-19
    • 2023-01-19
    • 2023-02-25
    • 2022-01-15
    • 2021-02-26
    • 2021-08-20
    相关资源
    最近更新 更多