首页 > 解决方案 > Mongoose findById 返回空文档

问题描述

我正在尝试使用 MEAN 堆栈实现 CRUD 操作。我在通过 ID 获取用户时遇到问题。它显示状态为真,但它返回一个空文档。

这是我的模型:

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

在检查邮递员时,我得到了 status: true 但它返回一个空白文档。我不知道发生了什么事请任何人帮忙。提前致谢!!

标签: node.jsmongoosemongodb-querymongoose-schema

解决方案


您无法找到并返回用户可能有多种原因。我会仔细检查此清单以查看可能发生的情况:

  1. 当您定义架构时,该required字段采用布尔值或函数,而不是字符串。为了安全起见,将字符串更改true为以确保所有新的数据库记录都包含这些字段是有意义的。(https://mongoosejs.com/docs/schematypes.html#schematype-options

  2. 当您在控制器中导入模型时,无需mongoose.model再次调用;此步骤在您的模型文件中执行。确保您mongoose.model('User', userSchema)在模型文件/模块中导出对象,然后const User = require(<pathToModelFile>);在控制器模块中执行正常操作。

如果这仍然不起作用...

  1. 您需要确保您的记录实际上保存在您的数据库中。通过运行$ mongo并使用此处找到的命令在终端中运行 mongo shell 来使用您的数据库并搜索用户集合: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;

推荐阅读