mongoose - nodejs - 由于某种原因没有方法

时间:2014-10-31 06:14:33

标签: node.js mongoose

遇到一些问题!

错误是

local: 
  { password: '$2a$08$kSflSzcciqWN78nfqAu/4.ZBZaXkqb19bEypeWcuSxg89yPNuijYO',
    email: '***@gmail.com' } } has no method 'usersCharacters'

但确实有方法! 我不确定它是否正确出口。据我所知,我这样做的方式类似于用户使用的其他方法,除非在这里似乎不起作用。

user.js模型文件

....
module.exports = mongoose.model('User', UserSchema);

var User = mongoose.model('User', UserSchema);


/* method works :D ! -- not sure if over complicated though! */
UserSchema.methods.usersCharacters = function(email,cb){
  User.findOne( {'local.email' : email }).exec(function(err, user){
    if (err) console.log("shit");
    var _return = [];

    user.characters.forEach(function(err, i){
      Character.findOne({ "_id" :user.characters[i] }).exec(function(err2, dude){
        _return.push(dude);

        /* Can't think of a smarter way to return :( */
        if ( i == user.characters.length-1)
          cb(_return);
      });
    });
  });
};

routes.js

/* This doesn't work! I am wondering how I might be able to return this users characters -- 
 *
 * The error is here btw! TypeError: Cannot call method 'usersCharacters' of undefined -- line with character : ****
 */
app.get('/profile', isLoggedIn, function(req, res) {
    var mongoose = require('mongoose');
    var UserSchema = mongoose.model('User', UserSchema);
    console.log(UserSchema);
    // ERROR ON THIS LINE! : (
    characters : req.user.usersCharacters(req.user.email, function(_characters){ 
                   console.log("list of characters: " + _characters);
                   return _characters;
                   res.render('profile.ejs', {
                     user : req.user, // get the user out of session and pass to template
                     characters : characters
                   });

这里有一个包含更多模型文件代码的要点:

https://gist.github.com/hassanshaikley/d4766251ec53feec8e84

2 个答案:

答案 0 :(得分:1)

在创建UserSchema模型之后添加到User 的方法,在User模型实例上无法使用。

所以在创建User模型之前创建方法:

UserSchema.methods.usersCharacters = function(email,cb){ ... };

var User = mongoose.model('User', UserSchema);
module.exports = User;

在相关说明中,只有第一次调用mongoose.model('User', UserSchema)才会处理架构以创建'User'模型。后续调用将忽略UserSchema参数并返回现有模型。

答案 1 :(得分:0)

JohnnyHK是正确的,创建猫鼬模型对象的顺序为:

  1. 使用var UserSchema = new mongoose.Schema({...});创建架构属性。
  2. 使用UserSchema.methods.usersCharacters = ...向架构中添加其他功能,就像您所做的一样。
  3. 使用模式创建模型,如var User = mongoose.model('User', UserSchema);
  4. 使用module.exports = User;导出模型

但是,这不是您问题的直接原因。您正在调用名为.usersCharacters()的对象上的user。虽然它的键/值对可能与Mongoose文档对象的键/值对相同,但它不是Mongoose文档对象。  相反,它是一个通用Javascript对象。您必须首先使用以下命令在数据库中查找相应的Mongoose文档对象:

User.findOne( {'local.email' : req.user.email } )).exec(function(err, userDoc){
  if (err) console.log("shit");
  var characters = req.user.usersCharacters(req.user.email, function(_characters){ 
      console.log("list of characters: " + _characters);
      return _characters;
  });
  res.render('profile.ejs', {
    user : req.user, // get the user out of session and pass to template
    characters : characters
  });
});

请注意,传递给req.user的{​​{1}}对象将只包含请求中发送的属性,这些属性可能与res.render()对象中的属性不同。

但是请注意,我目前无法访问使用userDoc返回的文档的实例方法。如果遇到此问题,可以在这里查看我的主题:Instance methods not defined for Mongoose findOne() query result?