user.findOne() 总是 returns 空

user.findOne() always returns null

我正在尝试从本地 MongoDB 实例获取猫鼬 return 数据。其他一切 运行 都很好。该表格正在向护照提供数据。我还手动将数据插入到 mongodb 中。唯一的错误在 user.findOne 中。当我将用户打印到控制台时,而不是 returning 一些数据它 returns null

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/member');

// authentication using passport
passport.use(new LocalStrategy({
    usernameField: 'user',
    passwordField: 'password'
},
    function (username, password, done) {
        User.findOne({ user: username }, function (err, user) {
            // console.log(user, username, password);
            if (err) {
                console.log(`Error in configuring passport-local \n ${err}`);
                return done(err);
            }
            if (!user) {
                console.log(`Invalid username or password!!`)
                return done(null, false);
            }
            return done(null, user);
        });
    }
));

我的架构:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    user: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    },
    dept: String,
    yr: Number,
    name: {
        type: String
    }   
}, {
    timestamps: true
});


module.exports = mongoose.model('member_list', userSchema, 'member_list');

这是我的完整代码:https://github.com/krush11/site

如果您需要更多信息,请告诉我

    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    const User = require('../models/member');

    // authentication using passport
    passport.use(new LocalStrategy({
        usernameField: 'user',
        passwordField: 'password'
    },
        async function (username, password, done) {

            await User.findOne({ user: username }, function (err, user) {
                // console.log(user, username, password);
                if (err) {
                    console.log(`Error in configuring passport-local \n ${err}`);
                    return done(err);
                }
                if (!user) {
                    console.log(`Invalid username or password!!`)
                    return done(null, false);
                }
                return done(null, user);
            });
        }
    ));

该函数看起来不错,但请尝试使其异步,然后 await 来自数据库的查询。看看我对您的代码所做的修改。您可能还想重构代码并使用 promises 而不是回调并将所有内容包装在 try{} catch{} 块中。

但是使函数异步并等待查询将解决这个问题,这是因为 findOne() 方法实际上 returns 一个查询并且在您对其进行控制台之前可能尚未完成。

如果您还有任何问题,请告诉我。