Не удается установить заголовки после их отправки клиенту Ошибка в node.js

#javascript #mysql #node.js #database #express

#javascript #mysql #node.js #База данных #экспресс

Вопрос:

Не удается установить заголовки после их отправки клиенту, я получаю эту ошибку. Я провел некоторое исследование, и я думаю, что это из-за более чем одного обратного вызова, но я не могу решить эту проблему. Пожалуйста, помогите мне исправить эту проблему. Я прилагаю к настоящему мой 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});
    });
}
 

Комментарии:

1. Вам нужно преобразовать все вызовы функций с обратными вызовами в асинхронную функцию с. Promise Таким образом, ваш код будет более последовательным, и вы легко устраните свою проблему. И избегайте внедрения SQL, вставляя пользовательский ввод в SQL-запрос путем объединения строк. Узнайте, как использовать параметры запроса.

Ответ №1:

В вашей функции show вы выполняете запрос к базе данных, внутри обратного вызова у вас есть оператор if else с res.render и res.redirect . Таким образом, так или иначе отправляется результат. Таким образом, вы не можете отправить результат, когда оператор if завершен. Удалите это res.render('show', {data:result, message: message}); . строка, и все готово!

Комментарии:

1. Я удалил res.render(‘show’, {data:result, message: message}); сообщение, написанное после части if else , но при его удалении новый файл.ejs напрямую перенаправляет на places.ejs вместо перенаправления на страницу show.ejs

2. Из-за этого только я добавил туда res.render

3. Это потому, что ваш запрос, вероятно, не дает результатов. Я думаю, что это была проблема в вашем другом вопросе?

4. да, но я могу вставлять данные в базу данных.

5. Ах, я думаю, что наконец-то вижу это. В sql вы не можете использовать равный sing: = Вы должны использовать LIKE . SELECT * FROM nt_data` WHERE username LIKE' " username "' . И не используйте переменную в такой строке. Используйте его так же, как вы делали в своей новой функции SELECT * FROM nt_data` WHERE username LIKE ?", [username]