ximalangyashan 2022-09-13 18:34 采纳率: 98.9%
浏览 19
已结题

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

3条回答 默认 最新

  • CSDN专家-showbo 2022-09-13 18:52
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月21日
  • 已采纳回答 9月13日
  • 创建了问题 9月13日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题