user.findOne() 总是返回 null

Posted

技术标签:

【中文标题】user.findOne() 总是返回 null【英文标题】:user.findOne() always returns null 【发布时间】:2021-06-02 07:09:17 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:
    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 来自数据库的查询。看看我对您的代码所做的修改。您可能还想重构您的代码并使用承诺而不是回调并将所有内容包装在 try catch 块内。

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

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

【讨论】:

以上是关于user.findOne() 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

节点猫鼬总是在 findOne 上返回错误

为啥函数返回的值总是 null 或 undefined?

Mongoose User.findOne 既不返回错误也不返回成功

mongoose 各种执行

Sequelize - findOne().success() 未定义

Android savedInstanceState 总是返回 null