为什么我收到'对象不是函数;

Why I receive 'object is not a function'?

本文关键字:对象 函数 为什么      更新时间:2024-04-09

在我的nodejs应用程序中,在User mongoose模式中,我有这样的方法:

/*
 * Passport-Local Mongoose will add a username, hash and salt field to store the username, the hashed password and the salt value.
 */
var User = new Schema({
  email: String,
  token: String,
  twitter: {
    id: String,
    token: String,
    displayName: String,
  }
});
    /*
 * Find user by twitter id.
 */
User.statics.findOrCreateByTwitterId = function (token, tokenSecret, profile, fn) {
  this.findOne({
    'twitter.id': profile.id
  }, function (err, user) {
    if (err) return fn(err, null);
    if (user) {
      return fn(null, user)
    };
    // create user
    var newUser = new User();
    newUser.username = profile.username;
    newUser.twitter.id = profile.id;
    newUser.token = token;
    newUser.displayName = profile.displayName;
    // create user
    newUser.save(function (err) {
      if (err) {
        return fn(null, null);
      }
      return fn(null, newUser)
    });
  });
};
User.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', User);

当它被呼叫时,我收到:

2015-02-24T07:47:24.162Z - debug: Mongoose:  -  users  -  findOne  -  { 'twitter.id': '90411931' } 
2015-02-24T07:47:24.327Z - error: Caught exception:  TypeError: object is not a function

其中第32行为:

var newUser = new User();

你觉得有什么问题吗?

嗯。。。猫鼬。架构无法实例化。你需要从这样的模式创建一个模型,

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

要从模式中引用当前模型,可以执行var newUser = new this.constructor();

要创建新用户,需要new模型,而不是User模式。因此,在模型的静态函数中保存初始this,这样它就不会在findOne回调中丢失一次,然后使用它来创建用户:

User.statics.findOrCreateByTwitterId = function (token, tokenSecret, profile, fn) {
  var model = this;
  model.findOne({
    'twitter.id': profile.id
  }, function (err, user) {
    if (err) return fn(err, null);
    if (user) {
      return fn(null, user)
    };
    // create user
    var newUser = new model();
    newUser.username = profile.username;
    newUser.twitter.id = profile.id;
    newUser.token = token;
    newUser.displayName = profile.displayName;
    // create user
    newUser.save(function (err) {
      if (err) {
        return fn(null, null);
      }
      return fn(null, newUser)
    });
  });
};