TypEerror:对象功能模块没有方法"检查Disponibility n#34;

时间:2014-12-31 18:52:30

标签: javascript node.js mongoose

我试图为我的模型创建一些功能方法,但是当我发送请求时,它会返回给我这个回溯:

/home/nano/Dev/JS/OMI/node_modules/mongoose/lib/utils.js:413
        throw err;
              ^
TypeError: Object function model(doc, fields, skipId) {
    if (!(this instanceof model))
      return new model(doc, fields, skipId);
    Model.call(this, doc, fields, skipId);
  } has no method 'checkDisponible'
    at /home/nano/Dev/JS/OMI/app/routes/facturas.js:33:18
    at Function.forEach (/home/nano/Dev/JS/OMI/node_modules/lodash/dist/lodash.js:3297:15)
    at Promise.<anonymous> (/home/nano/Dev/JS/OMI/app/routes/facturas.js:32:9)
    at Promise.<anonymous> (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
    at Promise.emit (events.js:98:17)
    at Promise.emit (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
    at handleSave (/home/nano/Dev/JS/OMI/node_modules/mongoose/lib/model.js:133:13)
    at /home/nano/Dev/JS/OMI/node_modules/mongoose/lib/utils.js:408:16
    at /home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection/core.js:125:9

问题是,在模型编译之前,我在模式中声明了函数方法,如文档中所述:

var itemSchema = new Schema({
  _id: String,
  descripcion: String,
  costo: Number,
  precioMin: Number,
  precioMax: Number,
  existencia: Number,
  disponible: Number,
});

itemSchema.methods.checkDisponible = function(itemId, cant) {
  this.findById(itemId, function(err, item) {
    if (err)
      return false;
    if (item.existencia >= item.disponible && item.disponible >= cant)
      return true;
    else
      return false;
  });
};

var Item = mongoose.model('Item', itemSchema);

这是路线代码:

crear: function(req, res) {
    var nuevaFactura = {
      _id: req.body._id,
      cantidadItem: req.body.cantidadItem,
      condPago: req.body.condPago,
      decripcion: req.body.descripcion,
      monto: req.body.monto,
      items: [],
      cliente: req.body.cliente
    }, 
    factura;

    _.forEach(req.body.items, function(item) {
      nuevaFactura.items.push(item);
    });

    factura = new Factura(nuevaFactura);

    factura.save(function(err, factura) {
      if (err)
        return res.status(500).json({ msg: "error interno en la base de datos creando factura", error: err });

      _.forEach(factura.items, function(item) {
        if (Item.checkDisponible(item, factura.cantidadItem)) {
          Item.findById(item, function(err, token) {
            if (err)
              return res.status(500).json({ msg: "error interno en la base de datos actualizand item", error: err });
            token.existencia = token.existencia - factura.cantidadItem;
            token.disponible = token.disponible - factura.cantidadItem;

            token.save(function(err) {
              if (err)
                return res.status(500).json({ msg: "error interno en la base de datos guardando cambios en item", error: err });
            });
          }); // fin Item.findById
        } else {
          return res.status(400).json({ msg: 'No hay existencia o disponibilidad del producto', item: item }); 
        }
      }); // fin _.foreach

      Cliente.update({ _id: factura.cliente }, { $push: { facturas: factura._id } }, function(err) {
        if (err) 
          return res.status(500).json({ msg: "error interno en la base de datos actualizando cliente", error: err });
      }); // fin Cliente.update

      res.status(200).json({ msg: 'Factura creada', factura: factura });
    }); // fin factura.save
  }, // fin crear

我知道,这是一个肮脏的代码,但它只是一个草稿。

谢谢大家!

1 个答案:

答案 0 :(得分:1)

我看到的第一个问题是您将checkDisponible()注册为method,但您真正想要的是将其注册为static。模式methods对象上的函数可以从模型实例中调用,但statics对象上的函数可以从模型构造函数中调用,就像调用它一样。

itemSchema.statics.checkDisponible = function(itemId, cant) {
  //...
};

一旦整理完毕,您将遇到一个新问题。在checkDisponible()内部,您正在调用findById()这是一个异步函数。您不能简单地返回结果,您必须修改checkDisponible()以接受回调或返回承诺。我会在这里提供回调版本,以便清楚我能得到什么。

itemSchema.methods.checkDisponible = function(itemId, cant, cb) {
  this.findById(itemId, function(err, item) {
    if (err)
      cb(false);
    if (item.existencia >= item.disponible && item.disponible >= cant)
      cb(true);
    else
      cb(false);
  });
};

_.forEach(factura.items, function(item) {
  Item.checkDisponible(item, factura.cantidadItem, function(result) {
    if(result) {
      //...
    }
  });
});