【问题标题】:Mongoose - How to handle empty resultsMongoose - 如何处理空结果
【发布时间】:2018-08-11 00:47:48
【问题描述】:

我对 Mongo DB/Mongoose 还很陌生,我想确保我以正确的方式处理 Mongoose 错误。我正在尝试通过其 _id 搜索文档。这是我的查询:

const team = await Team.findOne({_id:req.body.invitedTeamID});

这很好用,但我需要验证是否有任何记录从此查询返回,所以经过一番研究后,我将其修改为:

const team = await Team.findOne({_id:req.body.invitedTeamID}, function(err, doc){
  if(doc.length === 0 || err){
    console.log("no record found!")
  }
});

当我为受邀团队 ID 变量输入虚假对象 ID 时,我收到一个丑陋的 Mongoose 拒绝承诺错误,内容如下:

CastError: 值 "005a99

转换为 ObjectId 失败

上述任何一种或两种功能都会发生这种情况,我没有得到我的 console.log 语句。

谁能告诉我正确的处理方法是什么?

谢谢

【问题讨论】:

  • 你应该做类似_id: mongoose.Types.ObjectId(req.body.invitedTeamID)的事情,见这里stackoverflow.com/questions/6578178/…
  • 你能展示你的团队架构吗
  • @Striped 如果它实际上是一个有效的 ObjectId,您的方法有效,但如果它只是一个随机字符串,它会给我一个长而丑陋的承诺错误。为了在数据传递给不是 ObjectId 格式的查询的情况下处理丑陋的承诺错误,我应该将我的 Await 调用包装在 try catch 中吗?
  • 是的,你应该总是用 try/catch 包裹一个 await。

标签: javascript mongodb mongoose


【解决方案1】:

首先,您可以使用快捷方式Model.findById()通过ObjectId查询。其次,您正在混合async functioncallback function。您需要在方法中添加三件事:

  1. 验证ObjectId
  2. 检查查询的返回值
  3. 错误处理

修改后的方法如下所示:

const mongoose = require('mongoose');
const Team = require('../models/Team');

async function getTeamById(id) {
  if (!mongoose.Types.ObjectId.isValid(id)) {
    // handle bad id
  }
  try {
    const team = await Team.findById(id);
    if (!team) {
      // no team with such id, error handling code
    }
    // team was obtained, rest of the code
  } catch (error) {
    // handle query error
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2021-01-07
    • 2011-10-16
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多