node express Cannot set headers after they are sent to the client

各位看看怎么回事,网上说这个报错是服务端发送了多次响应给客户端造成的,看了好几遍我这也没有多次响应客户端啊。

//app.js部分
const express=require("express");
const app=express();
const md5=require("md5-node")
 
app.all("*",function(req,res,next){ //跨域处理
    console.log(88);
    res.header("Access-Control-Allow-Origin","*"); //header为express规范,setHeader为node规范
    res.header("Access-Control-Allow-Headers", "X-Requested-With, accept, origin, content-type");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1');
    res.header('Content-Type', 'application/json;charset=utf-8');
    next();
})
 
const sendRes=require("./api/proData/sendRes");
app.use(sendRes); //注册统一响应函数格式
 
const dbData=require("./db/db");
app.use(dbData); //注册数据库信息
 
app.get("/login",function(req,res,next){
    const formTel=req.query.tel; //提交至服务器的tel
    const formPassword=req.query.password; //提交至服务器的password
    if(!formTel||!formPassword) return res.sendRes(null,"请传入正确的表单",204)
    const sql=`select * from loginData where tel=${formTel}`;
    res.dbData.query(sql,function(err,sqlData){
        console.log(`loginRequest at DB || tel=${formTel}`);
        if(err){ //数据库错误
            return res.sendRes(null,"DB ERR!",204);
        }
        if(sqlData.length==0) return res.sendRes(null,"电话号码不存在,请重新输入",204);
        if(sqlData.length==1){
            if(formTel==sqlData.tel&&formPassword==sqlData.password) {
                const date=new Date();
                const token=`MARKET${md5(date)}`;
                const resObj={data:null,meta:{token:token,msg:"登录成功",status:200}}
                return res.json(resObj)
            }else{
                return res.sendRes(null,"密码有误,请重新输入",204)
            }
        }
    })
    next()
})
app.listen(3000,function(){
    console.log("server start at localhost:3000");
})
 
 
//sendRes.js部分
module.exports=function(req,res,next){
    res.sendRes=function(data,msg,status){
        var obj={};
        if(data==200){
            obj={data:null,meta:{msg:"Response success",status:200}};
            return res.send(obj)
        }
        obj={data,meta:{msg,status}};
        return res.send(obj);
    }
    next();
}
 
 
//db.js部分
const mysql=require("mysql");
const connection=mysql.createConnection({
        host:"localhost",
        user:"root",
        password:"root",
        database:"ddd"
    })
module.exports=function(req,res,next){
    res.dbData=connection;
    next()
};

dapp.get("/login"路由中最后的next()那句去掉。next会执行下一个中间件代码,由于没有下一个中间件可以执行,会走404错误处理输出错误响应。这样和异步查询数据的sendRes重复了。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632