Как исправить «User.findOne()», возвращающий нуль для пользователя

#node.js #mongodb #express #mongoose

#node.js #mongodb #выразить #мангуст

Вопрос:

В настоящее время я работаю над новым проектом и пытаюсь заставить работать маршрут входа. Но вход в систему всегда завершается неудачей, потому что метод User.findOne() всегда возвращает значение null.

Я попытался изменить экспорт из usermodel на

 var User = mongoose.model('User', UserSchema, 'User');
  

Но это ничего не изменило.

Я знаю, что подключение к базе данных в порядке, потому что маршрут регистрации работает нормально и сохраняется правильно.

Маршрут входа

 router.post('/login', function (req, res) {
    User.findOne({ username: req.body.username, password: req.body.password }, function (err, user) {
        if (err || user == null) {
            res.redirect('/login');
            console.log(user);
        } else {
            req.session.userId = user._id;
            res.redirect('/');
        }
    });
});
  

Схема пользователя

 var mongoose = require('mongoose');
var bcrypt = require('bcrypt');

var UserSchema = new mongoose.Schema({
    email: {
        type: String,
        unique: true,
        required: true,
        trim: true
    },
    username: {
        type: String,
        unique: true,
        required: true,
        trim: true
    },
    password: {
        type: String,
        required: true
    }
});

UserSchema.statics.authenticate = function (email, password, callback) {
    User.findOne({ email: email }).exec(function (err, user) {
        if (err) {
            return callback(err);
        } else if (!user) {
            var err = new Error('User not found.');
            err.status = 401;
            return callback(err);
        }
        bcrypt.compare(password, hash, function (err, result) {
            if (result === true) {
                return callback(null, user);
            } else {
                return callback();
            }
        });
    });
};

//hashing a password before saving it to the database
UserSchema.pre('save', function (next) {
    var user = this;
    bcrypt.hash(user.password, 10, function (err, hash) {
        if (err) {
            return next(err);
        }
        user.password = hash;
        next();
    });
});

var User = mongoose.model('users', UserSchema);
module.exports = User;
  

Подключение к базе данных

 var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/wowDb', { useNewUrlParser: true });
var db = mongoose.connection;
mongoose.set('useCreateIndex', true);

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () { });
  

Я использовал

 db.users.findOne({username: "Imortalshard"}); 
  

и получил вывод

 
{
        "_id" : ObjectId("5cc10cd13361880abc767d78"),
        "email" : "admin@wowdb.com",
        "username" : "Imortalshard",
        "password" : "$2b$10$7Ln5yHFqzPw/Xz6bAW84SOVhw7.c0A1mve7Y00tTdaKzxzTph5IWS",
        "__v" : 0
}

  

Консольный вывод из console.log (req.body) и console.log(user)

Я жду, что зарегистрированный мной пользователь сможет успешно войти в систему, но в настоящее время он просто перенаправляет меня обратно на страницу входа и выдает мне нулевое значение для пользователя в консоли.

Комментарии:

1. Если вы попытались изменить эту строку, то вы явно прочитали существующий ответ. Но чего вам, вероятно, не хватает, так это того, как называется фактическая коллекция в базе данных, к которой вы подключаетесь? Этот третий документ предназначен для отражения фактического названия коллекции. Без этого аргумента mongoose ожидает коллекцию с именем, users основанным на 'User' , в качестве объявленного имени для модели. Если вы не используете db.User.find() в mongo оболочке для возврата результатов, то, вероятно, это все еще неправильное название коллекции. Это, вероятно, db.user.find() , и поэтому mongoose.model('User', UserShema, 'user')

2. Либо это, либо именованная база данных в URI, переданном mongoose.connect() , отличается от того, где вы фактически хранили данные. Вход в mongo оболочку или Compass, например, подключается к test базе данных по умолчанию. Отсутствие результата всегда означает только одну из четырех вещей. 1. Ничто не соответствует заданному предикату запроса. 2. Указание на неправильное название коллекции. 3. Указание на неправильное имя базы данных. 4. Простое подключение к другому экземпляру MongoDB, отличному от того, где хранятся данные.

3. @NeilLunn db.users.findOne({username: <имя пользователя>}); отлично работает в оболочке mongo, поскольку я проверил правильность сохранения из формы регистрации. Я дважды проверил имя базы данных для mongoose.connect, и оно также правильное.

4. Вместо двойной проверки включите код, который фактически показывает строку подключения, и шаги, которые вы использовали из командной строки mongo, чтобы проверить, существует ли в вашем вопросе то, что вы хотите получить. Тогда мы все можем «перепроверить» с вами. Я также заметил, что у вас есть email и password в findOne() запросе. Из другого кода password будет казаться, что он хэширован и, следовательно, маловероятно, что вы отправляете из req.body . Также покажите эти значения в вашем вопросе вместе с документом, который вы ожидаете сопоставить и можете сопоставить из оболочки mongo.

5. @NeilLunn Я внес изменения, которые вы просили. На изображении показаны выходные данные как console.log (req.body), так и console.log(user).