查询每个Map元素nodejs/express时异步操作出现问题

z4iuyo4d  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(351)

我将mongoose用于db连接,在我的情况下,我将联系人作为一个对象数组接收,然后遍历每个数组元素,尝试查找数据库中已经存在的副本,但在此之前,会调用next()。
这是我的密码

req.body.contacts.map((contact) => {
    Contact.find(
      {
        contact_name: contact.contact_name,
        phone: contact.phone,
        user_id: req.userId,
      },
      (err, contacts) => {
        if (contacts.length > 0) {
          res.status(500).send({ message: "You have already submitted this contact" });
          return;
        } else if (err) {
          console.log(err);
        }
      }
    );
  });
  next();
zysjyyx4

zysjyyx41#

省去你的一些麻烦,使用 await 语法。在多个异步操作的情况下,回调或 .then() 语法是一个需要处理的噩梦。

for( let contact of contacts) {

    let found,
        conditions = {
            contact_name: contact.contact_name,
            phone: contact.phone,
            user_id: req.userId,
        };

    try {
        found = await Contact.findOne(conditions).lean().exec();
    } catch(err) {
        console.log(err);
    }

    if(found){
        res.status(500).send({ message: "You have already submitted this contact" });
        return;
    }
}

next();

添加 .lean() 获取纯json(而不是mongoose对象,速度更快),以及 .exec() 返回一个真实的承诺(不是一个表格),这样你就可以 await 它干净利落。

相关问题