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

那么,在我读了很多关于这个的post之后,我开始停滞不前了。 错误是stream行的Error: Can't set headers after they are sent

最好的答案是在这里,但是,我没有重复的函数或两次执行callback(至less不是我所知道的),它只是一个标准的基础restAPI。

完整的跟踪日志:

 /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; 

正如我看到你在这个函数中有错误

  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返回错误,所以你需要改变这个function

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

所有的路由都调用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头,这是不允许的。