路由错误:错误:发送后无法设置标头

时间:2014-12-16 19:57:25

标签: javascript node.js express

好吧,在我阅读了很多有关此问题的帖子后,我开始停滞不前。该错误是受欢迎的Error: Can't set headers after they are sent

最好的答案是here但是,我没有重复的函数或两次执行的回调(至少不是我所知道的),它只是一个标准的基础休息API。

完整跟踪日志:

/home/nano/Dev/JS/OMI/node_modules/mongoose/lib/utils.js:413
        throw err;
              ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
    at ServerResponse.header (/home/nano/Dev/JS/OMI/node_modules/express/lib/response.js:666:10)
    at ServerResponse.send (/home/nano/Dev/JS/OMI/node_modules/express/lib/response.js:146:12)
    at ServerResponse.json (/home/nano/Dev/JS/OMI/node_modules/express/lib/response.js:235:15)
    at Promise.<anonymous> (/home/nano/Dev/JS/OMI/app/routes/clientes.js:19:11)
    at Promise.<anonymous> (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:172:8)
    at Promise.emit (events.js:95:17)
    at Promise.emit (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.reject (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:111:15)
    at Promise.error (/home/nano/Dev/JS/OMI/node_modules/mongoose/lib/promise.js:95:15)

无论如何,我的代码很简单:

index.js:

"use strict";

var express = require('express'),
    router  = express.Router();

var clientes = require('./clientes');
var items    = require('./items');

router.route('/clientes')
  .post(clientes.crear)
  .put(clientes.actualizar)
  .delete(clientes.borrar);

router.route('./items')
  .post(items.crear)
  .put(items.actualizar)
  .delete(items.borrar);

module.exports = router;

clientes.js

注意:reqHelper是我自己的函数,通过req.body对象,现在已禁用。

"use strict";

// instancias de modelos
var Cliente = require('../models/models').Cliente;
// var reqHelper = require('./util');

var clientes = {

  crear: function (req, res) {
    var nuevoCliente = {
      _id: req.body._id,
      nombre: req.body.nombre,
      direccion: req.body.direccion,
      telefono: req.body.telefono
    };

    Cliente.create(nuevoCliente, function (err, cliente) {
      if (err) res.json({status: 500, error: err});
      res.json({ status: 500, cliente: cliente });
    }); // fin Cliente.create
  }, // fin crearCliente

  actualizar: function(req, res) {
    var ci = req.body._id;

    var clienteData = {};
    // reqHelper(req.body, clienteData);

    Cliente.update({ _id: ci }, clienteData, function(err, cliente) {
      if (err) res.json({status: 500, error: err});
      res.json({ status: 200, cliente: cliente });
    }); // fin Cliente.update
  }, //fin actualizarCliente

  borrar: function(req, res) {
    Cliente.remove({ _id: req.body._id }, function(err) {
      if (err) res.json({status: 500, error: err});
      res.json({ status: 200, msg: 'Cliente borrado' });
    });
  }, // fin borrarCliente
}; // fin actions

module.exports = clientes;

items.js

"use strict";

var Item = require('../models/models').Item;
// var reqHelper = require('./util');

var items = {
  crear: function(req, res) {
    var nuevoItem = {
      _id: req.body._id,
      descripcion: req.body.descripcion,
      costo: req.body.costo,
      precioMin: req.body.precioMin,
      precioMax: req.body.precioMax,
      existencia: req.body.existencia,
      disponible:req.body.disponible
    };

    Item.create(nuevoItem, function(err, item) {
      if (err) res.json({status: 500, error: err});
      res.json({ status: 200, item: item });
    });
  }, // fin crear

  actualizar: function(req, res) {
    var itemData = {};
    var itemId = req.body._id;  

    // reqHelper(req.body, itemData);

    Item.update({_id: itemId}, itemData, function(err, item) {
      if(err) res.json({status: 500, error: err});
      res.json({status: 200, token: item});
    }); // fin Item.update
  }, // fin actualizar

  borrar: function(req, res) {
    Item.remove({_id: req.body._id}, function(err){
      if(err) res.json({status: 500, error: err});
      res.json({ status: 200, msg: 'Item removido' });
    });
  }, // fin borrar
}; // fin items

module.exports = items;

2 个答案:

答案 0 :(得分:6)

您的所有路线都会拨打res.json两次。

if (err) res.json({status: 500, error: err});
res.json({ status: 200, msg: 'Cliente borrado' });

没有returnelse。你可能意味着

if (err) res.json({status: 500, error: err});
else res.json({ status: 200, msg: 'Cliente borrado' });

if (err) return res.json({status: 500, error: err});
res.json({ status: 200, msg: 'Cliente borrado' });

由于您正在调用它两次,因此您开始发送数据,然后第二次调用尝试再次发送application/json标头,这是不允许的。

答案 1 :(得分:3)

我发现你在这个功能中有错误

  crear: function (req, res) {
    var nuevoCliente = {
      _id: req.body._id,
      nombre: req.body.nombre,
      direccion: req.body.direccion,
      telefono: req.body.telefono
    };

    Cliente.create(nuevoCliente, function (err, cliente) {
      if (err) res.json({status: 500, error: err});
      res.json({ status: 500, cliente: cliente });
    }); // fin Cliente.create
  }, // fin crearCliente

我认为Cliente.create返回错误,所以你需要像这样改变这个函数

      if (err) {
        return res.json({status: 500, error: err});
      }
      res.json({ status: 500, cliente: cliente });