来自mongoose的错误不是MongoError的示例?

ftf50wuq  于 2023-10-19  发布在  Go
关注(0)|答案(3)|浏览(101)

我想捕获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,非常奇怪!有人好建议吗?

bwitn5fc

bwitn5fc1#

我不认为这回答了你的实际问题,但我不相信错误是这样被抓住的。相反,您应该检查

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

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

u7up0aaq

u7up0aaq2#

在MongoDB文档中,这似乎是处理错误的好方法(请参阅下面的官方文档链接)。
但是在我这边,我甚至没有成功地要求MongoServerError,我得到了“MongoServerError is undefined”。我用“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
}
6jygbczu

6jygbczu3#

mongoose正在使用的mongodb驱动程序示例通过mongoose.mongo公开,因此您可以执行e instanceof mongoose.mongo.MongoError
明确要求(我认为npm安装)mongodb-core可能会给你一个与mongoose使用的mongodb驱动程序不同的示例(副本)。所以require('mongodb-core') !== mongoose.mongorequire('mongodb-core').MongoError !== mongoose.mongo.MongoError

相关问题