我试图为我的模型创建一些功能方法,但是当我发送请求时,它会返回给我这个回溯:
/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
我知道,这是一个肮脏的代码,但它只是一个草稿。
谢谢大家!
答案 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) {
//...
}
});
});