无法在Express

时间:2016-11-05 19:06:01

标签: javascript express passport.js mean-stack passport-local

我正在尝试实现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);
    }

在我尝试登录时控制台中出现相同的错误..

编辑: 我添加了:

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);
    });
}

谢谢你们的帮助。

2 个答案:

答案 0 :(得分:1)

而不是

module.exports.getUserByUsername = ...

User.methods.getUserByUsername = ...

使用

User.statics.getUserByUsername = ...

请参阅http://mongoosejs.com/docs/2.7.x/docs/methods-statics.html

答案 1 :(得分:1)

如果您是NodeJS的新手,那么了解 module.exports exports 可能会有点令人困惑。重要的是要清楚这个概念,因为如果你进入严肃的nodejs开发,你会经常遇到这个问题。 我不会在这里解释导出如何在nodejs中工作,因为Web中有很多教程。例如;请阅读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