首页 > 解决方案 > Bcrypt将密码结果与Nodejs中的未定义错误进行比较

问题描述

我正在使用护照设置简单登录,尝试将用户密码与保存的密码进行比较时发生错误

module.exports = function (passport) {
    passport.use(new LocalStrategy(function (username, password, done) {
        let query = { email: username };

        User.find(query, function (err, user) {

            if (err) { 
                console.log(err); 
            }
            else {
                if (!user) {
                    console.log(3)
                    return done(null, false, { message: 'No user found' })
                } else {
                    bcrypt.compare(password, user.password, function (err, isMatch) {
                        if (err) {
                            console.log(err);
                        } else {
                            console.log(user.password)

                            if (isMatch) {
                                console.log(5)
                                return done(null, user);
                            } else {
                                console.log(6)
                                return done(null, false, { message: 'Wrong Password' })
                            }
                        }
                    })
                }
            }

        })
    }));

当我console.log(user)

[ { _id: 5c5995448a88110c35673bb7,
    firstname: 'test',
    lastname: 'sample',
    email: 'testsample@gmail.com',
    password:
     '$2b$10$bDVGjce/aDxr/NzXFw.qO.DA4tKjY6EwMARgl/NZfb0FNTaTxYwCW',
    __v: 0 } ]

但是使用 bcrypt,user.password结果是undefined在尝试将保存的密码与表单的password条目进行比较时,然而,似乎密码已从查询结果中收到,如console.log(user)结果所示。

标签: node.jsexpressejs

解决方案


由于 mongoDB 将“用户”作为包含单个项目的数组返回,因此您可以:

module.exports = function (passport) {
passport.use(new LocalStrategy(function (username, password, done) {
    let query = { email: username };

    User.find(query, function (err, user) {

        if (err) { 
            console.log(err); 
        }
        else {
            if (!user) {
                console.log(3)
                return done(null, false, { message: 'No user found' })
            } else {
                bcrypt.compare(password, user[0].password, function (err, isMatch) {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log(user[0].password)

                        if (isMatch) {
                            console.log(5)
                            return done(null, user);
                        } else {
                            console.log(6)
                            return done(null, false, { message: 'Wrong Password' })
                        }
                    }
                })
            }
        }

    })
}));

或者你可以

module.exports = function (passport) {
passport.use(new LocalStrategy(function (username, password, done) {
let query = { email: username };

User.find(query, function (err, user) {

    if (err) { 
        console.log(err); 
    }
    else {
        if (!user) {
            console.log(3)
            return done(null, false, { message: 'No user found' })
        } else {
            let userdata = user[0];
            bcrypt.compare(password, userdata.password, function (err, isMatch) {
                if (err) {
                    console.log(err);
                } else {
                    console.log(userdata.password)

                    if (isMatch) {
                        console.log(5)
                        return done(null, user);
                    } else {
                        console.log(6)
                        return done(null, false, { message: 'Wrong Password' })
                    }
                }
            })
        }
    }

})
}));

推荐阅读