Mongoose回调使用问题:无需async/await,如何终止控制器避免重复创建Client
解决方案:嵌套回调控制执行流程
你遇到的问题核心是异步回调的执行顺序问题——Client.findOne()是异步操作,它的回调还没执行完,后面的Client.create()就已经启动了,所以前者的return无法阻止后者执行。
不用async/await的话,最直接的方式是把Client.create()的逻辑嵌套到Client.findOne()的回调里,只有在确认没有重复remarks的情况下才执行创建操作:
Client.findOne({remarks}, (error, docs) => { if(error){ //logging error to DB return next(error) } if(docs){ return next(new ErrorResponse(IdenticalRemarksError, 400)) } // 仅当无重复remarks时,执行创建操作 Client.create( { fullname, email, telephone, country, city, remarks }, (error, docs) => { if(error){ return next(error) } res.status(201).json({ success: true, data: docs }) } ); })
这样调整后,Client.create()只会在findOne确认没有匹配文档(docs为null/undefined)时才会被调用。如果findOne查到重复数据或抛出错误,都会直接通过next()传递错误,不会进入创建逻辑。
内容的提问来源于stack exchange,提问作者Fun Strike
相关产品推荐
相关产品推荐

