javascript 如何在mongoDb中获取find()的返回值?

6za6bjd0  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(197)

我正在使用mongoDb创建一个登录页面(这不是正式登录)
对于我正在使用的登录系统,expresssession-expresspassport
有一个passport-config文件,用于获取登录表单发送的信息,并将信息与数据库进行比较。
文件:'护照配置.js'

import LocalStrategy from 'passport-local'
LocalStrategy.Strategy
import bcrypt from 'bcrypt' // to encrypt the password

function initialize(passport, getUserByEmail, getUserById) {
    const authenticateUser = async (email, password, done) => {
        const user = getUserByEmail(email) // calls the 'getUserByEmail()' and it uses the email taken by the login form

                // the rest of the code...
    }
    passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser)) // calls authenticateUser sending the info from the form
}

export default initialize

文件**'passport-config.js'导出函数,然后将其导入server.js**。作为参数,我使用(passport,函数通过电子邮件查找用户,函数通过id查找用户)

服务器.js

import initializePassaport from '../passport-config.js' // import the function from passport-config.js

import passport from 'passport'

import users from "../models/User.js"; // get the model Schema from the users database

initializePassaport(
    passport,
    email =>  users.findOne({"email": email}, {}, (err, user) => user) // get the email that was sent as a parameter of the getUserByEmail function inside the passport-config.js file
        id =>  users.findById(id, (err, user) => {email = user} => user) // same thing, but with id
)

//more code...

我的问题是当我在'server.js'中发送参数时,期望的值是通过emai找到用户,但相反,它发送了其他值。问题是显然,mongoDb中find()发送的值不能在函数之外。
我把一个控制台. log:“电子邮件=〉用户.findOne({“电子邮件”:email},{},(err,user)=〉{console.log(user})",并且它在控制台中返回正确的值。但是它没有将正确的值发送到函数
我已经试过放一个return了。但是它也不起作用。
我试着研究如何得到这个值,但是我没有找到任何解决这个问题的方法
这段代码在使用一个普通数组而不使用真实的的数据库之前就可以工作了。

const users = [ // this is an exmaple
    {
    "id": '167252944716', 
    "username": 'adm',
    "email": 'adm@adm', 
    "password": '$2b$12$G/EwhnXj5P/y1NGTb5Sq4.OTY5m.BMferVHVJ27AtZGn8vt6qDsvi' //encrypted
    }
]

initializePassaport(
    passport,
    email => users.find(user => user.email === email),
    id => users.find(user => user.id === id)
)

我不知道我该怎么做才能将此信息发送到passport-config.js,有什么方法可以修复它吗?如果不清楚,请让我知道改进它,谢谢!

to94eoyn

to94eoyn1#

findOne和findById是异步函数,因此它会返回一个promise,您需要使用await关键字或.then()方法来解析它,请尝试使用类似于以下内容的内容:

const authenticateUser = async (email, password, done) => {
    try {
        const user = await getUserByEmail(email);
        const isMatch = await bcrypt.compare(password, user.password);
        if (isMatch) {
            return done(null, user);
        } else {
            return done(null, false, { message: 'Password incorrect' });
        }
    } catch (error) {
        return done(error);
    }
};

相关问题