Estaba tratando de usar las funciones virtuales del esquema mongoose para implementar banderas, pero no pude hacer que funcionaran. La base de datos mongoose está alojada en mongodb altas . He intentado borrar toda la colección y volver a mirar.
Aquí hay un ejemplo simplificado:
Digamos que tengo un esquema de usuario básico:
const mongoose = require('mongoose') const UserSchema = new mongoose.Schema({ name: String, email: String }, {toObject: {virtuals: true, getters: true}}) UserSchema.virtual('status').get(() => { return this.name }) const User = mongoose.model('User', UserSchema) module.exports = { User, UserSchema } En app.js tengo lo siguiente:
const mongoose = require("mongoose"); const express = require("express"); const {User} = require("./models/User") const app = express(); app.use(express.urlencoded({extended: true})); app.use(express.json()); mongoose.connect(process.env.DB_URL, { useNewUrlParser: true, useUnifiedTopology: true }); User.findById("600ae8001931ad49eae40c03", (err, doc) => { console.log(doc.status) }) const port = process.env.PORT || 5000; app.listen(port, () => { console.log(`server at http://localhost:${port}`); }); Me aseguré de que exista la identificación, pero el resultado siempre es undefined . ¿Qué estoy haciendo mal aquí?
basado en documentación de mangosta
No declare métodos usando funciones de flecha ES6 (=>). Las funciones de flecha evitan explícitamente vincular esto, por lo que su método no tendrá acceso al documento y los ejemplos anteriores no funcionarán
para que no pueda usar la función de flecha en get , haga lo siguiente:
UserSchema.virtual('status').get(function() { return this.name })Es por la forma en que está declarando que su función se pasa para get . La forma en que lo está haciendo es cambiar la referencia this .
UserSchema.virtual('status').get(function() { return this.name })Lo anterior lo mantendría