2016-11-05 1 views
0

Я пытаюсь реализовать passport.js и проблема заключается в том, экспортирующих функции в модели:не может экспортировать функцию в экспресс

модель пользователя файл (user.js) выглядит следующим образом:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var passportLocalMongoose = require('passport-local-mongoose'); 
var bcrypt = require('bcrypt'); 

var userSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 

userSchema.plugin(passportLocalMongoose); 

userSchema.methods = { 

    getUserByUsername: function(username, callback){ 
     var query = {username: username}; 
     userSchema.findOne(query, callback); 
     /*userSchema.findOne(query, function(err, user) { 
      callback(err, user); 
     }); */ 
    }, 

    getUserById: function(id, callback){ 
     userSchema.findById(id, callback); 
    }, 

    comparePassword: function(candidatePassword, hash, callback){ 
     bcrypt.compare(candidatePassword, hash, function(err, isMatch) { 
      if(err) throw err; 
      callback(null, isMatch); 
     }); 
    } 
} 

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

я называю модель (app.js):

// user schema/model 
var User = require('./models/user.js'); 

, и я пытаюсь использовать экспортируемые функции в паспорте (app.js):

passport.use(new localStrategy(
    function(username, password, done) { 
    User.getUserByUsername(username, function(err, user){ 
     if(err) throw err; 
     if(!user){ 
     return done(null, false, {message: 'Unknown User'}); 
    } 

    User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) throw err; 
     if(isMatch){ 
     return done(null, user); 
     } else { 
     return done(null, false, {message: 'Invalid password'}); 
     } 
    }); 
    }); 
    })); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

Я получил TypeError: User.getUserByUsername is not a function

Я попытался определить функцию относительно docs:

User.methods.getUserByUsername = function(username, callback){ 
     var query = {username: username}; 
     User.findOne(query, callback); 
    } 

и те же apperas ошибки в консоли, когда я пытаюсь войти в ..

EDIT : Я добавил:

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

module.exports = { 
    User: User 
}; 

и теперь он работает с определением методов:

module.exports.getUserByUsername() 

поэтому окончательный файл модели выглядит следующим образом:

// user model 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var passportLocalMongoose = require('passport-local-mongoose'); 
var bcrypt = require('bcrypt'); 

var userSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 

userSchema.plugin(passportLocalMongoose); 

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

module.exports = { 
    User: User 
}; 

module.exports.createUser = function(newUser, callback){ 
    bcrypt.genSalt(10, function(err, salt) { 
     bcrypt.hash(newUser.password, salt, function(err, hash) { 
      newUser.password = hash; 
      newUser.save(callback); 
     }); 
    }); 
} 

module.exports.getUserByUsername = function(username, callback){ 
    var query = {username: username}; 
    User.findOne(query, callback); 
} 

module.exports.getUserById = function(id, callback){ 
    User.findById(id, callback); 
} 

module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) { 
     if(err) throw err; 
     callback(null, isMatch); 
    }); 
} 

Спасибо вам, ребята, за вашу помощь.

+0

И как вам это нужно?«Пользователь» определен в модели пользователя, но если вы не сделали что-то вроде «var User = require ...», он не будет в паспорте? – adeneo

+0

Я ссылался на модель с 'var User = require ('./ models/user.js');' in 'app.js', поэтому у паспорта может быть доступ к модели, верно? – corry

ответ

1

Вместо

module.exports.getUserByUsername = ... 

или

User.methods.getUserByUsername = ... 

использования

User.statics.getUserByUsername = ... 

См http://mongoosejs.com/docs/2.7.x/docs/methods-statics.html

+0

Я попробовал с 'User.statics.getUserByUsername = function (имя пользователя, обратный вызов) { \t var query = {имя пользователя: имя_пользователя}; \t User.findOne (запрос, обратный вызов); } 'и появляется такая же ошибка :( – corry

+0

@corry Где вы разместили этот код? Пользователь должен ссылаться на схему, а не на пользователя после экспорта. – afuous

+0

Конечно, схема определяется как« var User = new Schema ({ имя пользователя: String, пароль: String }); 'и' User.statics.getUserByUsername' определяется в том же файле (user.js) вместо 'module.exports.getUserByUsername', как вы предложили. – corry

1

Если вы новичок в NodeJS то понимание module.exports и экспорта может быть немного запутанным. С этой концепцией важно быть кристально понятным, потому что вы часто сталкиваетесь с этим, если все же попадете в серьезную разработку nodejs. Я не собираюсь объяснять, как работает экспорт в nodejs, потому что в Интернете есть много учебников. например; Пожалуйста, прочитайте this.

Следуйте моему коду ниже, чтобы исправить вашу проблему.

//UserModel.js 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var bcrypt = require('bcrypt'); 
var passportLocalMongoose = require('passport-local-mongoose'); 

var userSchema = mongoose.schema({ 
     username: String, 
     password: String 
}); 

userSchema.plugin(passportLocalMongoose); 

userSchema.methods = { 
    createUser: function(...){..}, 
    getUserByUsername: function(..){..}, 
    getUserById: function(..){..}, 
    comparePassword: function(..),{} 

} 

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

Вы можете получить доступ к методам из вашего UserSchema как:

//Controller.js 
var User = require('path/to/UserModel.js'); 
User.createUser(..,..) 

Для получения более подробной информации вы можете обратиться к моему хранилище и посмотреть, как я делаю это here.

+0

Спасибо за ваше объяснение, теперь это много clerar, но все же появляется ошибка sam. Я определил методы userSchema в объекте, как в вашем примере 'userSchema.methods = { \t getUserByUsername: function (имя пользователя, обратный вызов) { \t \t var query = {имя пользователя: пользователь имя}; \t \t userSchema.findOne (запрос, обратный вызов); \t}, \t getUserById: функция (идентификатор, обратный вызов) { \t \t userSchema.findById (ID, обратный вызов); \t}, ... } 'и назвал его в app.js' User.getUserByUsername (имя пользователя, функция (эээ, пользователь) { если (ERR) бросок эээ;! если (пользователь) { возвращение сделано (null, false, {message: 'Unknown User'}); } ' – corry

+0

Не могли бы вы обновить вопрос с помощью текущего кода. Модель, Как вы звоните и т. д. Тогда я смогу помочь. – NarendraSoni

Смежные вопросы