Ответ от mongodb либо возвращает значение null, либо не может найти конкретный документ

#node.js #mongodb #express #mongoose

Вопрос:

Я создаю систему входа в систему, и у меня возникли некоторые проблемы, которые я не могу понять, как решить. Я пробовал несколько разных вариантов с помощью find() и findOne (), но ни один из них не работает в моем случае. Ниже приведено первое решение, которое я попытался решить эту проблему.

 router.post('/', async (req, res) => {
    try {
        const user = await User.find(User.username = req.body.user);
        if (req.body.pass == user.password)
            res.send('Login');
        else
            res.send('Passwords don't match');
    } catch {
        res.send('User Not Found');
    }
});
 

Это решение возвращает ответ catch: Пользователь не найден.

Это второе решение, которое я пробовал:

 router.post('/', async (req, res) => {
    try {
        const user = await User.find(User => User.username = req.body.user);
        if (req.body.pass == user.password)
            res.send('Login');
        else
            res.send('Passwords don't match');
    } catch {
        res.send('User Not Found');
    }
});
 

Это решение возвращает: Не удается установить свойство «имя пользователя» равным нулю.

В обоих случаях я отправляю этот запрос: {"user": "Lasse", "pass": "LasseMJ"} это пользователь, который, как я знаю, существует в моей базе данных.

Это моя схема Мангуста:

 const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    username: {type: String, required: true},
    password: {type: String, required: true}
});

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

Это мое server.js

 const express = require('express');
const bcrypt = require('bcrypt');
const mongoose = require('mongoose');
const userRoutes = require('./routes/users');
const loginRoutes = require('./routes/login');

if (process.env.NODE_ENV != 'production') {
    require('dotenv').config();
}

const app = express();
app.use(express.json());

app.use('/users', userRoutes);
app.use('/login', loginRoutes);


mongoose.connect(process.env.DB_CONNECTION, {
    useNewUrlParser: true,
    useUnifiedTopology: true 
 });
 const db = mongoose.connection;
 db.on('error', error => console.error(error));
 db.once('open', () => console.log('Connected to db'));

app.listen(3001);
 

Ответ №1:

AFAIK, find метод получает условие для поиска документов в качестве объекта JSON. Для поиска пользователя по имени пользователя синтаксис должен быть :

      const user = await User.find({username : req.body.user});
 

Обратите внимание, find что метод вернет массив вместо объекта, который мы можем использовать findOne для получения пользовательского объекта, например :

      const user = await User.findOne({username : req.body.user});
 

И в этом случае username он должен быть уникальным в коллекции.

Вы можете найти более подробную информацию из официального документа Мангуста здесь