Mongoose findById возвращает пустой документ - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь реализовать операции CRUD с использованием стека MEAN.У меня проблема с получением пользователя по Id.Он показывает статус true, но возвращает пустой документ.

Это моя модель:

const userSchema = new mongoose.Schema({
    fullName: {
        type: String,
        required: 'Full name can\'t be empty '
    },
    userName: {
        type: String,
        required: 'user name can\'t be empty ',
        unique: true
    },
    email: {
        type: String,
        required: 'email can\'t be empty ',
        unique: true
    });

mongoose.model('User', userSchema);

в моем контроллере:

const mongoose = require('mongoose');
const passport = require('passport');
var ObjectId = require('mongoose').Types.ObjectId;
const User = mongoose.model('User');

module.exports.getuser = (req, res, next) => {
    if(!ObjectId.isValid(req.params.id))
        return res.status(400).send(`No record with given id : ${req.params.id}`);

    User.findById(req.params.id, (err, user) => {
        if(!err){ res.status(200).json({status: true, user}); }
        else{ console.log('Error in retriving User :' + JSON.stringify(err, undefined, 2)); }
    });    
}

Это маршрут:

router.get('/:id', jwtHelper.verifyJwtToken, ctrlUser.getuser);

при проверке почтальона я получаю статус: true, но он возвращает пустой документ.Я не понимаю, что происходит, пожалуйста, помогите.Заранее спасибо !!

1 Ответ

0 голосов
/ 21 февраля 2019

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

  1. Когда вы определяете свою схему, поле required принимает логическое значение или функцию, а не строку.Чтобы быть в безопасности, имеет смысл изменить ваши строки на true, чтобы все новые записи БД содержали эти поля.(https://mongoosejs.com/docs/schematypes.html#schematype-options)

  2. Когда вы импортируете модель в свой контроллер, нет необходимости снова вызывать mongoose.model; этот шаг выполняется в файле вашей модели. Убедитесь, что вы экспортируете mongoose.model('User', userSchema) объект в файле / модуле модели, а затем выполните обычное const User = require(<pathToModelFile>); в модуле контроллера.

Если это все еще не работает ...

Вы хотите убедиться, что ваша запись действительно сохранена в вашей базе данных.Запустите оболочку Монго в терминале, запустив $ mongo и используйте найденные здесь команды для использования вашей базы данных и поиска в коллекции пользователей: https://docs.mongodb.com/manual/reference/mongo-shell/

Вот как я обычно кодирую свою модель и контроллеры (с маршрутами):

Файл модели - Обратите внимание, что вам требуется Mongoose

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    fullName: {
        type: String,
        required: true
    },
    userName: {
        type: String,
        required: true,
        unique: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    });

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

Контроллер / Маршрутизатор -

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const passport = require('passport');
const User = require('User');

router.get('/:id', jwtHelper.verifyJwtToken, async (req, res) => {
   try {
    const user = await User.findById(req.params.id);
    res.status(200).json({status: true, user});
  } catch (e) {
    res.status(400).json({err: e});
  }
});

module.exports = router;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...