【问题标题】:Error from mongoose is not an instance of MongoError?来自猫鼬的错误不是 MongoError 的一个实例?
【发布时间】:2022-02-18 18:55:47
【问题描述】:

我想捕获E11000 duplicate key错误,所以特意插入同一个用户(uid是关键)

const MongoError = require('mongodb-core').MongoError
async function insertUser(uid) {
    try {
        await userModel.create({
            "uid": uid,
            "create_datetime": new Date(),
        })
    } catch (e) {
        console.log(e.constructor)
        console.log(e instanceof MongoError)
    }
} 

使用调试工具,我看到e的构造函数是class MongoError extends Error,而e instanceof MongoError的结果却是false,很奇怪!!有什么好的建议吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我认为这并不能回答您的实际问题,但我不认为这些错误会像这样被捕获。 相反,您应该检查是否

    error.name==='MongoError' && error.code === 11000 
    

    这是 mongoose 核心开发者之一 Valeri Karpov 推荐的解决方案:https://thecodebarbarian.com/mongoose-error-handling (这篇文章是2016年的,但我仍然相信它是有效的)

    【讨论】:

      【解决方案2】:

      在 MongoDB 文档上似乎这是处理错误的好方法(请参阅下面的官方文档链接)。

      但在我这边,我什至没有成功要求 MongoServerError,我得到“MongoServerError 未定义”。我使用“npm i mongodb”安装了 MongoDB NodeJS 驱动程序,但我也安装了 mongoose 并连接到远程 Atlas mongodb 服务器。你知道我应该如何要求 MongoServerError 吗?

      https://mongodb.github.io/node-mongodb-native/4.3/index.html#error-handling

      const client = new MongoClient(url);
      await client.connect();
      const collection = client.db().collection('collection');
      
      try {
        await collection.insertOne({ _id: 1 });
        await collection.insertOne({ _id: 1 }); // duplicate key error
      } catch (error) {
        if (error instanceof MongoServerError) {
          console.log(`Error worth logging: ${error}`); // special case for some reason
        }
        throw error; // still want to crash
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 2020-06-21
        • 2016-06-14
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 2020-07-02
        • 2018-02-16
        相关资源
        最近更新 更多