0

I am trying to get mongoose return data from local MongoDB instance. Eveything else is running fine. The form is giving data to passport. I have also inserted data into mongodb manually. The only error is in user.findOne. When I print user into console, instead of returning some data it 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);
        });
    }
));

My schema:

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');

Here's my full code: https://github.com/krush11/site

Let me know if you need any more info

J.F.
  • 13,927
  • 9
  • 27
  • 65

1 Answers1

2
    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);
            });
        }
    ));

The function looks good but try making it asynchronous then await the query from the database. Take a look at the modification I made to your code. You might also want to refactor your code and use promises instead of callback and wrap everything inside of try{} catch{} block.

But making the function asynchronous and awaiting the query will fix the issue, this is because the findOne() method actually returns a query and might not have completed before you console it.

Let me know if you still have any issue.

Dmitry S.
  • 1,544
  • 2
  • 13
  • 22
  • I urgently need your help @ https://stackoverflow.com/questions/73361563/why-am-i-not-able-query-user-findone-my-mongodb-after-setting-up-a-schema?noredirect=1#comment129557844_73361563 – SirBT Aug 15 '22 at 15:48