路由错误:错误:发送标头后无法设置标头
Routes error: Error: Can't set headers after they are sent
好吧,在我阅读了许多关于此的帖子之后,我开始停滞不前。错误是流行的Error: Can't set headers after they are sent
。
最好的答案在这里,但是,我没有重复的函数或两次执行的回调(至少我不知道(,它只是一个标准的基础休息 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)
无论如何,我的代码很简单:
索引.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;
客户.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;
项目.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;
您的所有路由都会呼叫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
标头,这是不允许的。
如我所见,您在此函数中有错误
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 });
相关文章:
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- NodeJS错误-Can't在发送标头后设置标头
- 错误:Can't在从forEach循环发送标头后设置标头
- 未捕获的类型错误:无法设置属性'innerHTML'如果为null,则将脚本移动到正文不会;不起作用
- PhantomJS(vs nightwatch.js)设置cookie错误
- 未捕获的类型错误:无法设置属性'背景'的未定义
- Express 4错误:Can't在发送标头后设置标头
- 任何人都知道IE7设置或更新/补丁,它可以防止IE因为jquery错误而无法加载页面
- JavaScript数组值设置错误
- 当张贴到数据库时,I'我得到了一个“;可以't在它们被发送错误之后设置报头”;
- Javascript设置日期不起作用,显示错误的时间
- NodeJS未处理的拒绝错误:Can't在发送标头后设置标头
- 未捕获的类型错误:无法设置属性'onclick'为null.已尝试window.onload
- 未捕获类型错误:无法设置未定义的属性“操作”
- 节点.js未捕获的异常类型错误:无法设置未定义的预处理 ''
- 谷歌地图:- 无效值错误:设置图标:不是字符串;并且没有网址属性;并且没有路径属性
- Json字符串如果键错误设置显示.否则显示数据
- jquery数据表的Javascript语法错误设置属性
- ES6 /巴别塔传播错误设置
- 创建图像元素,然后通过javascript错误设置样式属性