gpt4 book ai didi

javascript - 如何从异步 Mongoose 中间件后 Hook 中抛出错误

转载 作者:行者123 更新时间:2023-11-30 14:29:33 25 4
gpt4 key购买 nike

从异步中抛出错误的正确方法是什么 Mongoose middleware Hook

代码示例

以下 TypeScript 代码使用 mongoose 的 post init 事件来运行一些检查,这些检查在函数从 mongoDb 检索文档时触发。此示例中的 postInit() 函数正在执行一些背景检查。它应该在某些情况下失败,然后返回 Promise.reject('Error!');

schema.post('init', function (this: Query<any>, doc: any) {
return instance.postInit(this, doc)
.catch( err => {
return err;
});
});

钩子(Hook)工作正常。 IE。以下代码触发 Hook :

MyMongooseModel.findOne({ _id : doc.id}, (err, o : any) => {
console.log(o);
});

但是,如果 postInit() 失败,错误不会传回给调用函数。相反,文档被返回。

预期行为

我正在寻找将此错误传递给调用函数的正确方法。如果背景检查失败,则调用函数不应取回文档。

我尝试了不同的方法来引发这个错误。例如。 抛出新错误('错误');。但是,这会导致 UnhandledPromiseRejectionWarning 并仍然返回文档。

最佳答案

这里是 Mongoose 维护者。不幸的是,init() Hook 是同步的,我们没有做好记录。我们开了一个GitHub issue并将尽快添加文档。在 post('init') 中报告错误的唯一方法是 throw

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('debug', true);

const GITHUB_ISSUE = `init`;
const connectionString = `mongodb://localhost:27017/${ GITHUB_ISSUE }`;
const { Schema } = mongoose;

run().then(() => console.log('done')).catch(error => console.error(error.stack));

async function run() {
await mongoose.connect(connectionString);
await mongoose.connection.dropDatabase();

const schema = new mongoose.Schema({
name: String
});
schema.post('init', () => { throw new Error('Oops!'); });

const M = mongoose.model('Test', schema);

await M.create({ name: 'foo' });

await M.findOne(); // Throws "Oops!"
}

这是因为 Mongoose 假定 init() is synchronous internally .

关于javascript - 如何从异步 Mongoose 中间件后 Hook 中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51424417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com