解决Cannot set headers after they are sent to the client

本文探讨了在Express应用中遇到的Cannotsetheadersaftertheyaresenttotheclient问题,重点在于排查接口中多余的数据库响应,并以MySQL为例,提供了一个使用Promise和多条SQL查询的数据库查询方法。通过实例展示了如何确保单次请求只返回一次响应,以避免客户端混乱。
摘要由CSDN通过智能技术生成

问题原因

出现Cannot set headers after they are sent to the client的原因,客户端发出一次请求,服务器给出两次及以上响应。

解决办法

建议大家排查一下接口,清除掉多余的响应。

// 第三方插件
const mysql = require('mysql');

// 数据库信息 
let dbinfo = {
    host: '127.0.0.1', //数据库的ip地址
    user: 'root',      //登录数据库的账号
    password: '123456',//数据库的密码
    database: 'test', //数据库的名称
    multipleStatements: true, // 支持执行多条 sql 语句
}

// 定义公共的数据库查询方法,传入三个参数 sql语句,res,参数:前两个为必传,参数不传默认为空数组
let db = function (sql, res, params = []) {
    return new Promise((resolve, reject) => {
        // 一、新建一个连接池
        let pool = mysql.createPool(dbinfo)
        // 二、连接
        pool.getConnection((error, connection) => {
            // 三、使用sql语句操作
            connection.query(sql, params, (err, results, fields) => {
                if (err) {
                // res是调用接口时,如果执行mysql执行出错,直接返回报错信息
                    res.send({
                        code: 500,
                        status: false,
                        msg: "服务器内部错误:" + err.message
                    })
                } else {
                    resolve(results)
                }
                // 四、释放连接池
                connection.release()
            })
        })
    })
}

调用db方法示例

// router是express框架的路由 , db为我们定义的mysql查询方法
const { router , utilSuccess , utilErr , db  } = require('../../util/util');

router.post('/deleteWxuser',   (req,res)=>{
    let { id  } = req.body,
    deleteSql =  'delete from wxuser where id in (?)';
    db( deleteSql , res , [ id ] ).then( sqldata =>{
        if( sqldata.affectedRows ){
            res.send({
                ...utilSuccess,
                msg: "删除用户成功"
            })
        }else{
            res.send({
                ...utilErr,
                msg: "删除用户失败",
            })
        }
    })
})

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值