路由错误:错误:发送后无法设置标头
那么,在我读了很多关于这个的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' });
没有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
头,这是不允许的。