2011-09-14 14 views
32

Moja locationsModel file:Jak zdefiniować metody w modelu Mongoose?

mongoose = require 'mongoose' 
threeTaps = require '../modules/threeTaps' 

Schema = mongoose.Schema 
ObjectId = Schema.ObjectId 

LocationSchema = 
    latitude: String 
    longitude: String 
    locationText: String 

Location = new Schema LocationSchema 

Location.methods.testFunc = (callback) -> 
    console.log 'in test' 


mongoose.model('Location', Location); 

nazywać go używam:

myLocation.testFunc {locationText: locationText}, (err, results) -> 

ale pojawia się błąd:

TypeError: Object function model() { 
    Model.apply(this, arguments); 
    } has no method 'testFunc' 

Odpowiedz

24

Hmm - Myślę, że Twój kod powinien być wygląda bardziej podobnie:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 

var threeTaps = require '../modules/threeTaps'; 


var LocationSchema = new Schema ({ 
    latitude: String, 
    longitude: String, 
    locationText: String 
}); 


LocationSchema.methods.testFunc = function testFunc(params, callback) { 
    //implementation code goes here 
} 

mongoose.model('Location', LocationSchema); 
module.exports = mongoose.model('Location'); 

Następnie kod wywołujący może wymagać powyższy moduł i instancję modelu takiego:

var Location = require('model file'); 
var aLocation = new Location(); 

i dostęp do metody tak:

aLocation.testFunc(params, function() { //handle callback here }); 
+0

Przepraszam, jeśli źle odczytałem tutaj, ale nie widzę, jak to się różni od kodu OP. – Will

+0

Czy ta sama metoda może być użyta w jakiś sposób przy użyciu powłoki MongoDB? – p0lAris

+0

@Will, myślę, że różnica polega na tym, że iZ. stosuje funkcję do schematu, a nie do modelu. – kim3er

15

Zobacz Mongoose docs on methods

var animalSchema = new Schema({ name: String, type: String }); 

animalSchema.methods.findSimilarTypes = function (cb) { 
    return this.model('Animal').find({ type: this.type }, cb); 
} 
+1

+1 za link do dokumentacji – allenhwkim

+1

Problem polega na tym, że w trakcie wykonywania otrzymuję komunikat "animal.findSimilarTypes is not a function"! –

+0

W moim przypadku, z dokładnie tym samym przykładem 'tenmodel' jest niezdefiniowany. Każdy pomysł, dlaczego? –

35

Nie określiłeś, czy chciałeś zdefiniować metody klasy lub instancji. Ponieważ inni pokryte metody instancji, here's jak chcesz zdefiniować klasy/metody statyczne:

animalSchema.statics.findByName = function (name, cb) { 
    this.find({ 
     name: new RegExp(name, 'i') 
    }, cb); 
} 
+1

Aby ukończyć twoją odpowiedź, jest to przykład użycia (z tej samej strony): 'var Animal = mongoose.model ('Animal', animalSchema);' Animal.findByName ('fido', funkcja (err, zwierzęta) {konsola .log (zwierzęta)}); –

+0

Brawura za statyczne! Tego właśnie szukałem – Vaiden

0
Location.methods.testFunc = (callback) -> 
    console.log 'in test' 

powinny być

LocationSchema.methods.testFunc = (callback) -> 
    console.log 'in test' 

Metody muszą być częścią schematu. Nie model.

Powiązane problemy