2013-08-14 17 views
6

Próbuję użyć Mongoose do połączenia MongoDB z Nodejs.Błąd "Obiekt nie ma metody xxx" podczas używania Mongoose

Mam mój kod jak poniżej. Kiedy próbuję zrobić GET/POST poprzez API/użytkowników dostaję

Błąd


TypeError: Object function model(doc, fields, skipId) { 
[08/14 21:28:06 GMT+0800]  if (!(this instanceof model)) 
[08/14 21:28:06 GMT+0800]  return new model(doc, fields, skipId); 
[08/14 21:28:06 GMT+0800]  Model.call(this, doc, fields, skipId); 
[08/14 21:28:06 GMT+0800] } has no method 'list' 

Czy ktoś mógłby wyjaśnić, co robię źle? Musiałem podzielić mój kod do różnych plików, ponieważ mam wiele funkcji i nie chcę zadzierać je albo moi app.js lub indeks/routes.js

app.js

//database connection 
mongoose.connect('....'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
console.log("Conncection Success !"); 
}); 

users_module= require('./custom_modules/users.js'); 

users_module.init_users(); 
... 
    app.get('/api/users',user.list); // routing code from expressjs 

/custom_modules/users.js

function init_users() { 

    userSchema = mongoose.Schema({ 
     //id: Number, 
     usernamename: String, 
     hash: String, 
     ... 

    }); 

    userSchema.methods.list = list; 

    UserModel = mongoose.model('User', userSchema); 

} 

function list() { 
    return UserModel.find(function (err, users) { 
     if (!err) { 
      return users; 
     } else { 
      return console.log(err); 

     } 
    }); 
}); 

exports.init_users = init_users; 

szlaki/user.js

exports.list = function (req, res){ 

    var users = UserModel.list(); // <---------- This is the error Line 
    return res.send(users); 

} 
+0

Na którym linia widziałaś ten błąd? – zsong

+0

Zaktualizowałem błąd w pytaniu. A także wskazał linię, w której wystąpił błąd. Błąd występuje wewnątrz tras/user.js –

+0

'UserModel' nie ma metody' list'. Dodałeś go do instancji 'UserModel' używając' methods.' Możesz dodać 'UserModel.list = list', aby go dodać. – WiredPrairie

Odpowiedz

5

Właściwość obiektu obiektu model w Mongoose służy do dodawania funkcji do wystąpień obiektów modelu. Tak więc w twoim kodzie funkcja list jest dodawana do instancji UserModel. Jeśli natomiast chcesz mieć static jak funkcja jednoelementowy, to można go dodawać bezpośrednio do obiektu UserModel zwrócony przez wywołanie mongoose.model('UserModel', userModelSchema);:

UserModel.list = list; 

Teraz można nazwać to, aby powrócić do listy wszystkich użytkowników.

Należy zauważyć, że nadal jest to funkcja asynchroniczna. Tak więc nie można po prostu zwrócić wyników wywołania funkcji, ponieważ będzie ona normalnie pusta. find jest asynchroniczny, więc funkcja list musi również zaakceptować wywołania zwrotnego, która może zostać wywołana, gdy lista została zwrócona:

UserModel.list(function(list) { 
    res.render(list); 
}); 
+0

Ostatni twój akapit sprawia, że ​​sprawy są dla mnie bardziej zrozumiałe. Dzięki ! Teraz rozumiem . –

+1

Metody statyczne można również zdefiniować za pomocą słowa kluczowego statyka - animalSchema.statics.findByName = function (name, cb) {} –

Powiązane problemy