You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:55:28