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

Routes error: Error: Can't set headers after they are sent

本文关键字:错误 设置 路由      更新时间:2023-09-26

好吧,在我阅读了许多关于此的帖子之后,我开始停滞不前。错误是流行的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' });

没有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 标头,这是不允许的。

如我所见,您在此函数中有错误

  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 });