我正在尝试实现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);
});
}
谢谢你们的帮助。
答案 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。