【问题标题】:Mongoose findById returns the empty docMongoose findById 返回空文档
【发布时间】:2019-07-15 00:55:19
【问题描述】:

我正在尝试使用 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 但它返回一个空白文档。 我不知道发生了什么事请任何人帮忙。 提前致谢!!

【问题讨论】:

  • _id 类型可能有问题?在数据库上它(我认为)是一个ObjectId,但您为findById 函数提供了一个String
  • 但它以前工作过。有没有其他方法。我想通过 id 获取用户。
  • 我会尝试使用User.findById(ObjectID.createFromHexString(req.params.id)),以消除对类型转换问题的任何疑问...
  • 我试过不行。
  • 您可以尝试在if 语句之前添加console.log(err, user) 吗?

标签: node.js mongoose mongodb-query mongoose-schema


【解决方案1】:

您无法找到并返回用户可能有多种原因。我会仔细阅读这份清单,看看会发生什么:

  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;

【讨论】:

  • 按照您的建议,我将所有必填字段设置为 true,并按照您在第二步中的建议导出了 mongoose.model,而且我的数据库中的记录也很少。但还是不行。
  • @TylerGoodman,必填字段什么时候起作用?你可以用这个函数做什么?
猜你喜欢
  • 2019-07-14
  • 2020-05-13
  • 1970-01-01
  • 2021-02-05
  • 2015-04-18
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多