护照本地猫鼬:没有给出用户名错误
Passport local mongoose: no username was given error
在我的前端登录表单上,我只有输入字段 email
和 password
。 Passport 本地需要一个 usernameField
名称并抛出一个 [MissingUsernameError: No username was given]
。有什么办法让passport local不期待usernameField
?
如果您想使用电子邮件地址而不是用户名,那么您需要告诉 passport。为此,请查看以下代码片段:
passport.use(new LocalStrategy({
usernameField: 'email', // this is where you do that
passwordField: 'password'
},
(email, password, done) => {
User.findOne({
email: email
}, (error, user) => {
if (error) {
return done(error);
}
if (!user) {
return done(null, false, {
message: 'Username or password incorrect'
});
}
// Do other validation/check if any
return done(null, user);
});
}
));
要补充答案,如果您不需要自定义用户身份验证方法,您可以简单地使用 passport-local-mongoose 中的 User.authenticate() 方法。下面的实现将允许在登录时以 name="email" 作为用户名从表单输入字段中读取值。
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, User.authenticate()));
您的用户模式仍应使用名为 "username" 和 "password" 的键,否则将 return 出错。
var mongoose = require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');
var userSchema = new mongoose.Schema({
username: String,
password: String
});
// Add methods from passport-local-mongoose (authenticate, register etc)
userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', userSchema);
创建用户并将其保存到数据库时,将 req.body.email 分配给用户名
app.post('/register', (req, res) => {
User.register(
new User({
username: req.body.email,
}),
req.body.password,
(err, user) => {
...
}
)
}
在我的前端登录表单上,我只有输入字段 email
和 password
。 Passport 本地需要一个 usernameField
名称并抛出一个 [MissingUsernameError: No username was given]
。有什么办法让passport local不期待usernameField
?
如果您想使用电子邮件地址而不是用户名,那么您需要告诉 passport。为此,请查看以下代码片段:
passport.use(new LocalStrategy({
usernameField: 'email', // this is where you do that
passwordField: 'password'
},
(email, password, done) => {
User.findOne({
email: email
}, (error, user) => {
if (error) {
return done(error);
}
if (!user) {
return done(null, false, {
message: 'Username or password incorrect'
});
}
// Do other validation/check if any
return done(null, user);
});
}
));
要补充答案,如果您不需要自定义用户身份验证方法,您可以简单地使用 passport-local-mongoose 中的 User.authenticate() 方法。下面的实现将允许在登录时以 name="email" 作为用户名从表单输入字段中读取值。
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, User.authenticate()));
您的用户模式仍应使用名为 "username" 和 "password" 的键,否则将 return 出错。
var mongoose = require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');
var userSchema = new mongoose.Schema({
username: String,
password: String
});
// Add methods from passport-local-mongoose (authenticate, register etc)
userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', userSchema);
创建用户并将其保存到数据库时,将 req.body.email 分配给用户名
app.post('/register', (req, res) => {
User.register(
new User({
username: req.body.email,
}),
req.body.password,
(err, user) => {
...
}
)
}