我不爱吃大蒜 2021-11-05 12:26 采纳率: 50%
浏览 72
已结题

node.js请求/login路由时报错,Cannot set headers after they are sent to the client

请求路径为http://localhost:3000/login?tel=110&password=123时,就会跳出错误信息;

img

请求路径为http://localhost:3000/login时,可以返回正确信息,返回信息为{"data":null,"meta":{"msg":"请传入正确的表单","status":204}};
各位看看怎么回事,网上说这个报错是服务端发送了多次响应给客户端造成的,看了好几遍我这也没有多次响应客户端啊。

//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()
};
  • 写回答

1条回答 默认 最新

  • CSDN专家-showbo 2021-11-05 13:17
    关注

    去掉next调用

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000