我在构建mongoose方法时遇到问题

ny6fqffe  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(157)

我在mongoose中使用回调函数时遇到问题。

Client.findOne({remarks}, (error, docs) => {    
        if(error){
            //logging error to DB
            return next(error)
        }

        if(docs){
            return next(new ErrorResponse(IdenticalRemarksError, 400))
        }
        

    })

    Client.create(
        { fullname, email, telephone, country, city, remarks },
        (error, docs) => {
            if(error){
                return next(error)
            }

            res.status(201).json({
                success: true,
                data: docs
            })

        }
    );

在Client.findOne()回调中的返回并没有结束整个注册控制器,即Client.create()仍然在运行。我知道这是因为返回是Client.findOne()的本地返回。
什么是最好的重组方法,使Client.findOne()中if(docs){}内的return语句结束整个控制器函数,而不产生async await?即如果在findOne()方法中发现一个注解,则不会创建客户端?

kpbwa7wx

kpbwa7wx1#

溶液1

您可以将Client.create()部分放在Client.findOne()的回调内,如果没有错误,则执行它。

溶液2

不要使用回调,而是使用async/await,这将使您的代码更具可读性。
注意:我知道你写了你不想要async/await,但是我把它作为第二个解决方案添加进来,这样你就可以比较代码的可读性。

const someFunction = async (req, res, next) => {
  try {
    const client = await Client.findOne({ remarks }); 

    if(client) return res.status(400).json({ success: false });

    const new_client = await Client.create({ fullname, email, telephone, country, city, remarks });

    return res.status(200).json({ success: true, client: new_client }); 
  } catch (error) {
    return res.status(400).json({ success: false });
  }
}
qyzbxkaa

qyzbxkaa2#

请尝试以下代码:

Client.findOne({ remarks }, (error, docs) => {
  if (error) {
    //logging error to DB
    return next(error);
  }

  if (docs) {
    return next(new ErrorResponse(IdenticalRemarksError, 400));
  }

  Client.create(
    { fullname, email, telephone, country, city, remarks },
    (error, docs) => {
      if (error) {
        return next(error);
      }
      res.status(201).json({
        success: true,
        data: docs
      })

    }
  );
});

相关问题