MongoDB插入成功后能否删除catch块?避免无关错误触发重复回调
问题描述
升级MongoDB驱动后,必须用.then()和.catch()替代原来的单一回调,但遇到了问题:后续调用栈中的任何错误都会跳进MongoDB的.catch()块,导致done被重复触发——而done本来应该只执行一次。原本简洁易追踪的代码迁移后失去了连贯性。
原有代码
DB.insertOne(something).then( (r) => { done({success:true}); }).catch( (e) => { done({success:false, message:e.code}); });
需求与无效尝试
需要让.catch()仅处理插入操作本身的错误(比如重复_id插入错误),插入成功后,避免后续无关错误触发这个.catch()。尝试过delete this.catch但无效,无效代码如下:
DB.insertOne(something).then( (r) => { delete this.catch;//does not work done({success:true}); }).catch( (e) => { done({success:false, message:e.code}); });
解决方案
核心是把.catch()的作用范围严格限制在插入操作阶段,不让它捕获后续逻辑的错误,有两种实用实现方式:
方式1:用then的第二个参数隔离错误
then的第二个回调函数只会捕获前面Promise(也就是insertOne)的错误,不会捕获自身回调里的错误,刚好匹配需求:
DB.insertOne(something) .then( (r) => { // 插入成功后的逻辑,这里的错误不会触发下面的错误回调 done({success:true}); }, (e) => { // 仅处理insertOne本身的错误 done({success:false, message:e.code}); });
也可以用链式写法把插入操作的错误单独捕获,避免影响后续逻辑:
DB.insertOne(something) .catch( (e) => { // 只处理插入错误 done({success:false, message:e.code}); // 抛出错误,阻止进入后续then throw e; }) .then( (r) => { // 插入成功后的逻辑,错误不会被前面的catch捕获 done({success:true}); });
方式2:用async/await简化逻辑
如果环境支持ES7+,async/await能让错误边界更直观,代码逻辑和原单一回调一样清晰:
async function handleInsert() { try { // 仅在try块包裹插入操作,捕获它的错误 await DB.insertOne(something); // 插入成功后的逻辑,这里的错误不会进入下面的catch done({success:true}); } catch(e) { // 仅处理插入操作的错误 done({success:false, message:e.code}); } } handleInsert();
内容的提问来源于stack exchange,提问作者user1709076
相关产品推荐
相关产品推荐

