【问题标题】:Cannot set headers after they are sent to client EXPRESS JS将标头发送到客户端 EXPRESS JS 后无法设置标头
【发布时间】:2022-02-05 19:15:01
【问题描述】:

我对 Express 和 React 还很陌生,但遇到了一些问题。 我已经为多表插入创建了一个 API,并且我正在传递一个包含来自 React 客户端的数组的对象 我的数据被存储在表中,但在那之后,当我尝试将响应作为 res.send() 发送时,它给了我一个错误,因为一旦它们被发送到客户端就无法设置标题。

下面是我的 POST req API 文件

enter code here
router.post("/",function(req,res){
console.log(req.body.expense);
console.log(req.body.expenseListArr);
budget_id=req.body.expense.budget_id;
expenseListArr=req.body.expenseListArr;
conn.query("insert into tblexpense(budget_id,status) values('" +budget_id+"',0)",function(Inserterr){
    if(!Inserterr){
        conn.query("select max(expense_id) expense_id from tblexpense",function(Displayerr,result){
            if(!Displayerr){
                expense_id=result[0].expense_id;
                expenseListArr.forEach(function(expenseList) {
                    conn.query("insert into tblexpense_list(expense_id,category_id,amount,description,status) values('" +expense_id+"','"+expenseList.category_id+"','"+expenseList.amount+"','"+expenseList.description+"',0)",function(MultiInserterr){
                        if(MultiInserterr){
                            console.log("right");
                            return res.json({msg:"asd"});
                        }
                        else{
                            console.log("wrong");
                            console.log(MultiInserterr);
                        }
                    });
                });
            }
            else{
                console.log("wrong");
                console.log(Displayerr);
            }
        });
    }
    else{
        console.log("wrong");
        console.log(Inserterr);
    }
});

});

【问题讨论】:

    标签: mysql api express web


    【解决方案1】:

    快递res.json或res.send只能回复一次。您试图在循环中一次又一次地返回res.json。这就是它抛出异常的原因。 最好的方法是先从数组中的循环中提取数据,然后在执行循环时最后返回。
    下面是一个如何做到这一点的示例。

    router.post("/",function(req,res){
    console.log(req.body.expense);
    console.log(req.body.expenseListArr);
    budget_id=req.body.expense.budget_id;
    expenseListArr=req.body.expenseListArr;
    let resultArr = [];
    conn.query("insert into tblexpense(budget_id,status) values('" +budget_id+"',0)",function(Inserterr){
        if(!Inserterr){
            conn.query("select max(expense_id) expense_id from tblexpense",function(Displayerr,result){
                if(!Displayerr){
                    expense_id=result[0].expense_id;
                    expenseListArr.forEach(function(expenseList) {
                        conn.query("insert into tblexpense_list(expense_id,category_id,amount,description,status) values('" +expense_id+"','"+expenseList.category_id+"','"+expenseList.amount+"','"+expenseList.description+"',0)",function(MultiInserterr){
                            if(MultiInserterr){
                                console.log("right");
                                resultArr.push({msg:"your message or result object"});
                            }
                            else{
                                console.log("wrong");
                                console.log(MultiInserterr);
                            }
                        });
                    });
                    return res.json(resultArr);
                }
                else{
                    console.log("wrong");
                    console.log(Displayerr);
                }
            });
        }
        else{
            console.log("wrong");
            console.log(Inserterr);
        }
    
    });
    

    您可以执行此操作,也可以在回调之外返回 resultArr。你的路线会很好。

    有关此的详细说明,您应该查看此answer。

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2020-11-02
      • 2021-06-18
      • 2019-12-11
      相关资源
      最近更新 更多