¿Cómo incluyo un campo virtual en una respuesta JSON?
const ItemSchema = mongoose.Schema({ name: String, time: { type: Date, default: Date.now } }); ItemSchema.virtual('timeleft').get(function() { this.timeleft = 24 var currentTime = moment(); var timeStored = moment.utc(this.time).local().format(); this.timeleft -= currentTime.diff(timeStored, 'h'); });llamada a la API
app.get('/getAllItems', function(req, res, next) { Item.find({}, function(err, items) { res.json(items); }); });Entonces, técnicamente, la respuesta no incluirá el campo virtual timeleft. ¿Me estoy perdiendo de algo?
[ { name: "nike", time: "21/2/22" }, { name: "adidas", time: "21/2/22" }, ]// use Schema like this const ItemSchema = new Schema({ name: String, time: { type: Date, default: Date.now } }, { toObject: { virtuals: true }, toJSON: { virtuals: true } }); ItemSchema.virtual('timeleft').get(function() { // this.timeleft = 24 var currentTime = moment(); var timeStored = moment.utc(this.time).local().format(); console.log(" ====== 000 ======== ", currentTime.diff(timeStored, 'h')) return this.timeleft = currentTime.diff(timeStored, 'h'); }); const Item = mongoose.model('Item', ItemSchema); new Item({ name: 'Axl' }).save((err, result) => { console.log("=== err ", err, "=== result ", result) }); Item.find({}, function(err, items) { console.log("=========", items) });De acuerdo con los documentos de Mongoose, los virtuales de Mongoose no se almacenan en MongoDB, lo que significa que no puede realizar consultas en función de los virtuales de Mongoose.
// Will **not** find any results, because `domain` is not stored in // MongoDB. const doc = await User.findOne({ domain: 'gmail.com' }); doc; // undefinedSi desea consultar por una propiedad calculada, debe establecer la propiedad mediante un setter personalizado o un middleware de preguardado.
Modifique su esquema como se muestra a continuación:
const ItemSchema = mongoose.Schema({ name: String, time: { type: Date, default: Date.now }, toObject: { virtuals: true }, // <-- These properties will configure toJSON: { virtuals: true } // model to include virtuals });Modifique su llamada API de la siguiente manera:
app.get('/getAllItems', function(req, res, next) { Item.find({}, function(err, items) { res.json(items.toObject()); // <-- use .toObject() or .toJSON() }); });