2013-12-09 3 views
1

Так что мое приложение CRUD в это время делает две вещи, продолжает отправлять бесконечный пустой список. Но не только это, когда я пытаюсь удалить что-то, я получаю эту ошибку ... Перейдите ниже для кода api. Также, если вы видите что-нибудь, что может способствовать бесконечной информации о лемме списка.MEAN CRUD error crash can not set headers

C:\Users\\Desktop\Todo List\node_modules\mongoose\lib\utils.js:419 
     throw err; 
      ^
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) 
    at ServerResponse.res.setHeader (C:\Users\\Desktop\Todo List\node_modul 
es\express\node_modules\connect\lib\patch.js:63:22) 
    at ServerResponse.res.set.res.header (C:\Users\\Desktop\Todo List\node_ 
modules\express\lib\response.js:526:10) 
    at ServerResponse.res.json (C:\Users\\Desktop\Todo List\node_modules\ex 
press\lib\response.js:193:36) 
    at Promise.<anonymous> (C:\Users\\Desktop\Todo List\routes\api.js:45:21 
) 
    at Promise.<anonymous> (C:\Users\\Desktop\Todo List\node_modules\mongoo 
se\node_modules\mpromise\lib\promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (C:\Users\\Desktop\Todo List\node_modules\mongoose\node 
_modules\mpromise\lib\promise.js:79:38) 
    at Promise.fulfill (C:\Users\\Desktop\Todo List\node_modules\mongoose\n 
ode_modules\mpromise\lib\promise.js:92:20) 
    at C:\Users\\Desktop\Todo List\node_modules\mongoose\lib\query.js:1736: 
26 

маршруты апи код

var Todo = require('../app/models/todos').Todo; 

    exports.read = function(req, res) { 

     // use mongoose to get all todos in the database 
     Todo.find(function(err, todos) { 

      // if there is an error retrieving, send the error. nothing after res.send(err) will execute 
      if (!err) 
       res.send(err) 

      res.json(todos); // return all todos in JSON format 
     }); 
    }; 

    // create todo and send back all todos after creation 
    exports.create = function(req, res) { 

     // create a todo, information comes from AJAX request from Angular 
     Todo.create({text : req.body.text}, function(err, todos) { 
      if (err) 
       res.send(todos); 

      // get and return all the todos after you create another 
      Todo.find(function(err, todos) { 
       if (err) 
        res.send(err) 
       res.json(todos); 
      }); 
     }); 

    }; 

    // delete a todo 
    exports.delete = function(req, res) { 
     Todo.remove({_id : req.params._id 
     }, function(err, todos) { 
      if (err) 
       res.send(todos); 

      // get and return all the todos after you create another 
      Todo.find(function(err, todos) { 
       if (err) 
        res.send(err) 
       res.json(todos); 
      }); 
     }); 
    }; 

    //Update a todo 
    exports.update = function(req, res) { 
     Todo.findById(req.params._id, function(err, todos){ 
      todos.text = req.body.text; 
      console.log(todos); 
      todos.save(function() { 
       if (!err) { 
        res.send(todos); 
       } else if (err) { 
        res.send(err); 
       } 

       Todo.find(function(err, todos) { 
        if (err) 
         res.send(err) 
        res.json(todos); 
       }); 
      }); 
     }); 
    }; 

ответ

0

Я обычно вижу эту ошибку, когда я использую res несколько раз в моем экспресс-маршрут по ошибке. Убедитесь, что в обработчике маршрута (функция) вы используете только один раз res.

Например

app.get('/foo', doFoo); 

function doFoo(req, res) { 
    res.send('foo'); 
    res.send('bar'); 
} 

не будет работать, так как вы пытаетесь использовать Рез дважды, который внутренне вызывает res.end(), если я не ошибаюсь.

Редактировать: Как оказалось, я думаю, что вижу проблему в вашем коде.

// create a todo, information comes from AJAX request from Angular 
Todo.create({text : req.body.text}, function(err, todos) { 
    if (err) 
     res.send(todos); 

    // get and return all the todos after you create another 
    Todo.find(function(err, todos) { 
     if (err) 
      res.send(err) 
     res.json(todos); 
    }); 
}); 

Здесь вы используете res.send(todos) в том случае, если вы получаете сообщение об ошибке с Вашего первого звонка в Todo.create. Предполагая, что вы здесь получили ошибку, ваш код по-прежнему будет пытаться выполнить Todo.find. Как только это произойдет, он затем попытается выполнить res.json(todos), тем самым уволив два ответа и получив ошибку, которую вы видите о том, что не можете установить заголовки ответов после того, как они уже отправлены. Я думаю, вы можете исправить свой код, используя фактические операторы else, чтобы гарантировать, что вы не отправляете два ответа.

Todo.create({text:req.body.text}, function(err, todos){ 
     if (err) {...} 
     else { 
     .. your else code here 
     } 

}); 
+0

Я попытался удалить res.send, но это также не решило его. Обновлен с помощью кода выше. – KFDoom

+0

Эй, обновленный с новой информацией. – Hacknightly

+1

Yup. Ты был прав! Большое спасибо. – KFDoom

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