【问题标题】:Cannot set headers after they are sent to the client Error in node.js将标头发送到客户端后无法设置标头 node.js 中的错误
【发布时间】:2023-03-29 12:55:02
【问题描述】:

在将标头发送到客户端后无法设置标头我收到此错误。我做了一些研究,我认为这是因为不止一个回调,但我无法解决这个问题。请帮我解决这个问题。我附上我的 routes.js 代码。任何帮助都将是非常可观的。谢谢。

这是我的 routes.js 代码

const {
   con,g
   sessionStore
 } = require('./config/db');
const { route } = require('./routes/auth');
exports.new = function(req, res){
    message = '';
   if(req.method == "POST"){
      const post  = req.body;
      const username= post.username;
      const title= post.title;
      const state= post.state;
      const category= post.category;
      const description= post.description;
 
      if (!req.files)
                return res.status(400).send('No files were uploaded.');
 
      const file = req.files.uploaded_image;
      var img_name=file.name;
 
         if(file.mimetype == "image/jpeg" ||file.mimetype == "image/png"||file.mimetype == "image/gif" ){
                                 
              file.mv('public/imgs/uploads/'+file.name, function(err) {
                             
               var sql = "INSERT INTO `nt_data`(`username`,`title`,`state`,`category`, `images` ,`description`) VALUES (?,?,?,?,?,?)";
               var query = con.query(sql, [username, title, state, category, img_name, description], function(err) {
                  console.log(err)
                 if (!err) {
                   res.redirect('show/' + username);
                 }
                 else {
                  message = "This format is not allowed , please upload file with '.png','.gif','.jpg'";
                  res.render('new.ejs',{message: message});
                }
               }); 
            }); 
          
   } 
}
   else {
      res.render('new');
   }
 
};

exports.show = function(req, res){
    let message = '';
    var username = req.params.username;
    const sql="SELECT * FROM `nt_data` WHERE `username`='"+username+"'"; 
    con.query(sql, function(err, result){
       console.log(err)
      if(result.length <= 0){
      message = "show not found!";
      
      res.render('show.ejs',{data:result, message: message});
     }else{
      res.redirect('/places');
     }
     res.render('show', {data:result, message: message});
   });
  
};
 
exports.places=function (req,res){
   let message = '';
   var username = req.params.username;
    const sql="SELECT * FROM `nt_data` WHERE `username`='"+username+"'"; 
    con.query(sql, function(err, result){
       console.log(err)
       if(result.length <= 0)
         message = "places not found!";
   res.render('places.ejs',{data:result, message: message});
    });
}

【问题讨论】:

  • 您需要将所有带有回调的函数调用转换为带有Promise 的异步函数。这样,您的代码将更加连续,并且您可以轻松解决问题。并通过连接字符串将用户输入插入 SQL 查询来避免 SQL 注入。了解如何使用查询参数。

标签: javascript mysql node.js database express


【解决方案1】:

在你的 show 函数中你执行一个数据库查询,在回调中你有一个带有 res.render 和 res.redirect 的 if else 语句。因此,以一种或另一种方式发送结果。因此,当 if 语句完成时,您无法发送结果。 删除此res.render('show', {data:result, message: message});。线,你很高兴!

【讨论】:

  • 我删除了 res.render('show', {data:result, message: message});在 if else 部分之后写的语句,但在删除它时 new.ejs 文件直接重定向到 places.ejs 而不是重定向到 show.ejs 页面
  • 正因为如此,我才在那里添加了 res.render
  • 那是因为您的查询可能没有结果。我认为这是您另一个问题的问题?
  • 是的,但我可以在数据库中插入数据。
  • 啊我想我终于看到了。在 sql 中你不能使用相等的 sing: = 你应该使用 LIKE。 SELECT * FROM nt_data` WHERE username LIKE' "+username+"'。并且不要在这样的字符串中使用变量。像在新函数中一样使用它SELECT * FROM nt_data` WHERE username LIKE ?", [username]
猜你喜欢
  • 2022-11-30
  • 2019-10-20
  • 1970-01-01
  • 2023-01-14
  • 2020-07-11
相关资源
最近更新 更多