好吧,在我阅读了很多有关此问题的帖子后,我开始停滞不前。该错误是受欢迎的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;
答案 0 :(得分:6)
您的所有路线都会拨打res.json
两次。
if (err) res.json({status: 500, error: err});
res.json({ status: 200, msg: 'Cliente borrado' });
没有return
或else
。你可能意味着
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 });