【问题标题】:mongoose - nodejs - has no method for some reasonmongoose - nodejs - 由于某种原因没有方法
【发布时间】:2014-12-27 09:52:11
【问题描述】:

有一些问题!

错误是

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

【问题讨论】:

    标签: node.js mongoose


    【解决方案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参数并返回现有模型。

    【讨论】:

      【解决方案2】:

      JohnnyHK 正确的是,创建 Mongoose 模型对象的顺序是:

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

      但是,这不是您的问题的直接原因。您正在对名为 user 的对象调用 .usersCharacters()。虽然它可能具有与 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
        });
      });
      

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

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

      【讨论】:

        猜你喜欢
        • 2021-04-13
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        相关资源
        最近更新 更多