2015-07-05 16 views
0

Я продолжаю получать это сообщение об ошибке: Can't set headers after they are sent. Я довольно новый. Это простое приложение для списка дел, которое сохраняет каждый элемент в mongodb и отображает каждый элемент на странице. Он также имеет возможность удалять элементы. Кажется, все работает нормально, но я все еще продолжаю получать это сообщение. Сообщение об ошибке появляется каждый раз, когда я пытаюсь использовать маршрут элемента удаления. Как я уже сказал, он работает так, как я ожидаю. Он удаляет элемент из списка и из базы данных, но я все равно продолжаю получать это сообщение об ошибке. Вот то, что удаление маршрут выглядит следующим образом:Ошибка: не удается установить заголовки после их отправки ....? Node.js, mongodb

app.delete('/:id', function(req, res){ 
    var removal = req.params.id; 
    MongoClient.connect(dbUrl, function(err, db){ 
     var list = db.collection('list'); 
     list.remove({ _id: ObjectId(removal)}, updateList(res)); 
    }); 
    res.redirect('/'); 
}); 


//update list displayed on page -- to be used via callback after db change 
function updateList(res){ 
    MongoClient.connect(dbUrl, function(err, db){ 
     var list = db.collection('list'); 
     list.find({}).toArray(function(err, docs){ 
      res.render('index', { title: 'To do:', list: docs }); 
     }); 
    }); 
}; 

Я использовал res.redirect('/'), чтобы сделать это таким образом, URL показано в адресной строке не отображается ObjectId каждого элемента я удалить, но похоже, что проблема может быть , потому что, когда я избавлюсь от него, ошибка не возникает. Но я не хочу, чтобы этот идентификационный номер показывался вверху. Делать это так, кажется, работает. Почему это дает мне сообщение об ошибке? Есть ли другой способ сделать это?

+2

возможно дубликат [Как вернуть ответ от асинхронного вызова?] (HTTP: // stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) И вам действительно нужно прочитать это, чтобы понять различные вещи, которые вы делаете неправильно здесь. –

ответ

1

Вероятно этот кусок кода собирается, чтобы помочь вам. Но вам нужно узнать больше о обратных вызовов, функции и как использовать их ...

app.delete('someRouteName/:id', function(req, res){ 
    var removal = req.params.id; 
    MongoClient.connect(dbUrl, function(err, db){ 
     var list = db.collection('list'); 
     list.remove({ _id: ObjectId(removal)}, function(error){ 
      if(error){ 
       // Handle error 
      } 
      else{ 
       list.find({}).toArray(function(err, docs){ 
        if(err){ 
         // Handle error 
        } 
        else{ 
         return res.render('index', { title: 'To do:', list: docs }); 
        } 
       }); 
      } 
     }); 
    }); 
}); 

~ Приветствия

+0

Хорошо, это в основном гораздо более чистая версия кода, У меня есть и с обработчиками ошибок, но он по-прежнему делает то же самое, что и я, если я удалю res.redirect ('/'). По-прежнему существует проблема, о которой я упоминал, что я пытаюсь сделать так, чтобы строка URL не отображала ObjectId, и именно поэтому я использую перенаправление. Но перенаправление - это то, что дает мне ошибку. Вы знаете, есть ли лучший способ удалить ObjectId из строки URL? EDIT: Выяснил это. Просто удалил возврат из res.render, а затем возвратил res.redirect внутри обратного вызова на res.render. – Nathan

0

Вы, вероятно, нужно использовать return перед тем res.redirect

return res.redirect('/'); 
+0

Нет, такая же ошибка. – Nathan

+0

Попробуйте переместить 'res.redirect ('/');' прямо под 'list.remove ({_id: ObjectId (удаление)}, updateList (res));' –

Смежные вопросы