Passport local mongoose:未提供用户名错误

Passport local mongoose:未提供用户名错误,mongoose,mongoose-schema,Mongoose,Mongoose Schema,在我的前端登录表单上,我只有输入字段email和password。Passport local需要一个用户名字段名称,并抛出一个[MissingUsernameError:未提供用户名]。有没有办法让passport local不使用用户名字段?如果您想使用电子邮件地址而不是用户名,那么您需要告诉passport。为此,请参阅以下代码片段: passport.use(new LocalStrategy({ usernameField: 'email', // this i

在我的前端登录表单上,我只有输入字段
email
password
。Passport local需要一个
用户名字段
名称,并抛出一个
[MissingUsernameError:未提供用户名]
。有没有办法让passport local不使用
用户名字段?

如果您想使用电子邮件地址而不是用户名,那么您需要告诉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”的密钥,否则将返回错误

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);
创建用户并将其保存到db时,将req.body.email分配给用户名

app.post('/register', (req, res) => {
    User.register(
    new User({
        username: req.body.email,
        }),
    req.body.password,
    (err, user) => {
        ...
    }
    )
}

有。你用电子邮件代替用户名吗?是的,用电子邮件代替。明白了。还需要修改var newUser=newUser({username:req.body.email..});在路标路线上。非常感谢!