Métodos de instancia
// define a schema const animalSchema = new Schema({ name: String, type: String }); // assign a function to the "methods" object of our animalSchema animalSchema.methods.findSimilarTypes = function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); };Ahora todas nuestras instancias de animales tienen un método findSimilarTypes disponible.
const Animal = mongoose.model('Animal', animalSchema); const dog = new Animal({ type: 'dog' }); dog.findSimilarTypes((err, dogs) => { console.log(dogs); // woof});
Estaba leyendo los documentos de mongoose y no puedo entender el trabajo de este código. Puede alguien explicármelo.
Alguien explique el flujo de este código.
Los esquemas tienen un campo llamado methods . En ese campo puedes insertar tus propias funciones así:
animalSchema.methods.nameOfFunction = function() { // Return something here // The `this` keyword refers to the instance of the model // I return the type here return this.type; };Más tarde, cuando cree una instancia del esquema, puede usarlos.
// animalSchema is the Schema we inserted the function into earlier // create model from instance const Animal = mongoose.model('Animal', animalSchema); // Create ab Instance of the model // the function added to the methods field gets added // The dog gets created with type 'dog' const dog = new Animal({ type: 'dog' }); // Now we can call the function // the `this` in the function referes to `dog` var result = dog.nameOfFunction(); // Will put out "dog" console.log(result) En el ejemplo que proporcionó, la función agregada encuentra todos los animales con el mismo tipo que el animal creado. El argumento cb de la función es una devolución de llamada. Otra función que se llama cuando mangosta terminó de buscar.
// define a schema const animalSchema = new Schema({ name: String, type: String });Defina el esquema Animal: qué campos y características tiene un objeto animal cuando se guarda en la base de datos.
// assign a function to the "methods" object of our animalSchema animalSchema.methods.findSimilarTypes = function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); }; Defina que cada objeto creado con la receta animal también debe tener un método llamado findSimilarTypes(callback) .
const Animal = mongoose.model('Animal', animalSchema); const dog = new Animal({ type: 'dog' }); dog.findSimilarTypes((err, dogs) => { console.log(dogs); // woof });dog . Tiene el tipo 'dog' Observe que también existe dog.findSimilarTypes(cb) , tal como se define en el esquema.dog .Además, para abordar la pregunta adicional de Shauryan en los comentarios:
Puede consultar, por ejemplo, este recurso para comprender qué es una función de devolución de llamada: Función de devolución de llamada. Haré todo lo posible para explicar lo que sucede en tu ejemplo.
findSimilarTypes(cb) es una función que toma un solo parámetro, que también es una función.
Este tipo aquí es una función única y anónima.
(err, dogs) => { console.log(dogs); // woof } Cuando pasa una función como argumento, se llama "devolución de llamada". Veamos qué obtiene cuando llama a findSimilarTypes(cb) con la función anónima como argumento.
animalSchema.methods.findSimilarTypes = function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); }; se convierte en algo como esto (cuando reemplaza el cb con la función anónima):
return mongoose.model('Animal').find({ type: this.type }, (err, dogs) => { console.log(dogs); // woof });Ahora todo se reduce a cómo Mongoose ha definido su Model.find() . Cuando termina, llama a su segundo argumento con el error y el resultado de la búsqueda en la base de datos. El segundo argumento es la función anónima que pasamos anteriormente.
Se necesita un poco de tiempo para girar la cabeza alrededor de las devoluciones de llamadas. ¡Espero que esto ayude!