js执行return后的代码仍然执行Cannot set headers after they are sent to the client

项目场景:

使用node.js响应注册请求,同时判断数据库中没有已注册的用户名


问题描述

遇到return 代码不会停止,而会继续执行,从而导致了如下错误

Cannot set headers after they are sent to the client

将做出响应部分的代码提取如下:

exports.register = (req, res) => {
    const userinfo = req.body
    console.log(req.body);
    if (!userinfo.username || !userinfo.password) {
        return res.send({
            status: 1,
            message: 'cannot be null'
        })
    }
    let sql = 'select * from user where username=?'
    db.query(sql, [userinfo.username], function(err, results){
        if (err) {
            return res.send({
                status: 1,
                message: err.message
            })
        }
        if (results.length > 0) {
            return res.send({
                status: 1,
                message: 'username existed'
            })
        }
    })
    userinfo.password = bcryptjs.hashSync(userinfo.password, 10)
    console.log(userinfo.password);
    sql = 'insert into user set ?'
    db.query(sql, {
        username: userinfo.username,
        password: userinfo.password
    }, (err, results) => {
        if (err) {
            return res.send({
                status: 1,
                message: err.message
            })
        }
        return res.send({
            status: 0,
            message: 'register successfully'
        })
    })
}

原因分析:

因为这里使用的是数据库连接池,query是一个异步的方法,后边的代码自然会执行,想到这个原因后,笔者尝试使用async await的方式进行修改,但是效果不佳且产生了很多问题,比如:只要提交Post请求服务就会被迫停止,然后再次产生上述问题


解决方案:

笔者只会老老实实的再次使用嵌套,修改后代码如下:

exports.register = (req, res) => {
    const userinfo = req.body
    console.log(userinfo);
    if (!userinfo.username || !userinfo.password) {
        return res.send({
            status: 1,
            message: 'cannot be null'
        })
    }
    let sql = 'select * from user where username=?'
    db.query(sql, [userinfo.username], (err, results) => {
        if (err) {
            return res.send({
                status: 1,
                message: err.message
            })
        }
        if (results.length > 0) {
            return res.send({
                status: 1,
                message: 'username existed'
            })
        }
        userinfo.password = bcryptjs.hashSync(userinfo.password, 10)
        sql = 'insert into user set ?'
        db.query(sql, {
            username: userinfo.username,
            password: userinfo.password
        }, (err, results) => {
            if (err) {
                return res.send({
                    status: 1,
                    message: err.message
                })
            }
            res.send({
                status: 0,
                message: 'register successfully'
            })
        })
    })
}
  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值