2015-02-24 2 views
0

В моем nodejs приложение, внутри мангустов пользователя схемы У меня есть этот метод:Почему я получаю «объект не функция»?

/* 
* 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(); 

Do вы видите какую-то проблему?

+1

Я думаю ... мы должны видеть больше кода .. особенно там, где вы создали свой «Пользователь». –

+0

ошибка говорит о том, что 'Пользователь' не является ссылкой на функцию, но ссылка на переменную –

+0

@SarveshKumarSingh обновила мой вопрос. –

ответ

1

Хорошо ... mongoose.Schema не может быть экземпляр. Вам нужно создать модель из схемы, как это,

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

Для ссылки на текущую модели внутри схемы, вы можете сделать var newUser = new this.constructor();

0

Чтобы создать новый пользователь, вам необходимо 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) 

    }); 

    }); 
}; 
Смежные вопросы