Node.js Passport策略使用电子邮件或用户名login

我正在使用护照在我的node.js应用程序,我目前正在使用用户名login。

在我的用户注册页面上,我允许用户注册其唯一的用户名和电子邮件。

我想要一个login页面,并使用“使用用户名/电子邮件login:” _ __ _ __ _ _

脚本可以检测字段中是否有“@”,并查找电子邮件而不是用户名。

我已经尝试了几个小时无济于事。

这是我的passport.js

var mongoose = require('mongoose') var LocalStrategy = require('passport-local').Strategy var User = mongoose.model('User'); module.exports = function(passport, config){ passport.serializeUser(function(user, done){ done(null, user.id); }) passport.deserializeUser(function(id, done) { User.findOne({ _id: id }, function (err, user) { done(err, user); }); }); passport.use(new LocalStrategy({ usernameField: 'username', passwordField: 'password' }, function(username, password, done) { User.isValidUserPassword(username, password, done); })); } 

编辑:下面是user.js按要求

 var mongoose = require('mongoose'); var hash = require('../util/hash.js'); UserSchema = mongoose.Schema({ username: String, email: String, salt: String, hash: String }) UserSchema.statics.signup = function(username, email, password, done){ var User = this; hash(password, function(err, salt, hash){ if(err) throw err; // if (err) return done(err); User.create({ username : username, email: email, salt : salt, hash : hash }, function(err, user){ if(err) throw err; // if (err) return done(err); done(null, user); }); }); } UserSchema.statics.isValidUserPassword = function(username, password, done) { this.findOne({username : username}, function(err, user){ // if(err) throw err; if(err) return done(err); if(!user) return done(null, false, { message : 'Incorrect username.' }); hash(password, user.salt, function(err, hash){ if(err) return done(err); if(hash == user.hash) return done(null, user); done(null, false, { message : 'Incorrect password' }); }); }); }; var User = mongoose.model("User", UserSchema); module.exports = User; 

       

网上收集的解决方案 "Node.js Passport策略使用电子邮件或用户名login"

好的,你应该在你的Mongoose模型中有这样的东西:

 UserSchema.statics.isValidUserPassword = function(username, password, done) { var criteria = (username.indexOf('@') === -1) ? {username: username} : {email: username}; this.findOne(criteria, function(err, user){ // All the same... }); }; 

它是一个mongoose的事情,而不是护照的事情,如果你可以试试这个,使用bredikhin的答案^ _ ^:

 var criteria = {$or: [{username: username}, {email: username}, {mobile: username}, {anything: username}]}; 

关键是通过从MongoDB查询find用户!
这样,你可以有任何查询你想要find一个用户。