我在构建猫鼬方法时遇到问题

I have problem structuring mongoose methods

提问人:Fun Strike 提问时间:10/21/2022 更新时间:10/21/2022 访问量:22

问:

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

        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() 方法中找到备注,则不会创建客户端?

express async-await 回调 mongoose-models

评论


答:

0赞 Drashti Kheni 10/21/2022 #1

尝试使用以下代码后:

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
      })

    }
  );
});

评论

0赞 Fun Strike 10/21/2022
这是我曾经写的,我想按照猫鼬文档去
1赞 NeNaD 10/21/2022 #2

解决方案 1

你可以把 part 放在 的回调中,如果没有错误,则执行它。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 });
  }
}