Node中保存数据出现报错“Error: Can't set headers after they are sent.”
发布于 8 年前 作者 leachain 2924 次浏览 来自 问答

保存第一份数据正常,没有问题,紧接着保存第二份数据,出现这个报错“Error: Can’t set headers after they are sent.” 和数据没有关系,两份数据调换顺序保存,永远都是第一次能保存,第二次保存失败,出现报错。代码也检查了好几遍,没发现什么问题,有问题也不会第一次能保存成功,后面的不能保存成功。 不知道有哪位朋友遇见过类似的问题,求解。 用的是express+nodejs+mongodb

var frontMenuSchema = new Schema({ parentId: { type: String }, name: { type: String, unique: true }, url: { type: String }, icon: { type: String }, deep: { type: Number }, listOrder: { type: Number }, sub: { type: Array, default: [] }, status: { type: Boolean, default: 1 } }); var FrontMenu = mongoose.model(‘FrontMenu’, frontMenuSchema); exports.FrontMenu = FrontMenu;

//新增菜单 create: function (menu) { return FrontMenu.create(menu); }

FrontMenuModel
    .create(menu)
    .then(function () {
        console.log('success');
        req.flash('success', '添加成功');
        res.redirect('/admin/menu/front/add');
    })
    .catch(function (e) {
        console.log('error');
        req.flash('error', '添加失败');
        res.redirect('/admin/menu/front/add');
        next(e);
    });
3 回复

出现错误 中断了, 应该你重复了两次 res.send()

@jkjk77 FrontMenuModel .create(menu) .then(function () { console.log(‘success’); req.flash(‘success’, ‘添加成功’); res.redirect(’/admin/menu/front/add’); }) .catch(function (e) { console.log(‘error’); req.flash(‘error’, ‘添加失败’); res.redirect(’/admin/menu/front/add’); next(e); }); 执行了catch,没有进入到then

已找到问题,由于最开始第一次插入数据的时候,把字段名name保存的时候写错了,写成了namae,第一次保存之后collection已创建,因为name字段加了“唯一”,所以在索引内会有namae_1,第一次保存数据后发现了字段name写错了,然后更正name,然后再把刚刚保存的数据删掉,重新插入第一份数据,数据保存后实际上存在一个错误的索引字段namae_1,而且第一份数据的namae为空,而当第二份数据保存的时候,错误的索引namae_1字段的值仍然为空(因为我已经改正了name,并没有传入namae字段),此刻当然不能保存,因为namae_1是唯一索引,删除错误索引namae_1即可解决问题。

回到顶部