为什么使用猫鼬回调会导致数据保存两次?

时间:2019-01-15 08:58:14

标签: javascript mongodb express mongoose

我一直想知道为什么向Mongoose findOneAndUpdate函数添加回调会导致两次将数据保存到数据库?

public async addPersonAsFavorite(userId: string, friendId: string) {
    if (!await this.isPersonAlreadyFriend(userId, friendId)) {
      const friendList = FriendsList.findOneAndUpdate(
        { _id: userId },
        { $push: { friendsList: friendId } },
        { upsert: true, new: true },
        (err, data) => {
         if (err) console.error(err);
         return data;
        }
      );
      return friendList;
    }}

  public async isPersonAlreadyFriend(userId: string, friendId: string) {
    let isFriendFound = false;
    await FriendsList.findById(userId, (err, data) => {
      if (data) {
        console.log(data.friendsList);
      }
      if (err) console.error(err);
      if (data && data.friendsList.indexOf(friendId) > -1) {
        isFriendFound = true;
        console.log('already friend');
      } else {
        console.log('not friend');
        isFriendFound = false;
      }
    })
    return isFriendFound;
  }

如果我删除回调,则数据只会保存一次。

编辑:添加了第二段代码和新问题。 如果有人发送垃圾邮件,则添加朋友。该朋友将被添加多次,因为在添加第一个朋友之前,可以进行检查以防止它已经多次添加该人。

在允许再次调用该函数之前,如何确保它已完成对DB的写入?

1 个答案:

答案 0 :(得分:1)

也许问题出在isPersonAlreadyFriend方法中,因为您试图使用异步等待来调用它,但是随后您传递了回调,这使得该方法无法返回承诺。在mongodb中使用promise的严格方法应该是这样的:

public async isPersonAlreadyFriend(userId: string, friendId: string) {
    let isFriendFound = false;
    const data = await FriendsList.findById(userId);
    if (data) {
      console.log(data.friendsList);
    }
    if (data && data.friendsList.indexOf(friendId) > -1) {
      isFriendFound = true;
      console.log('already friend');
    } else {
      console.log('not friend');
      isFriendFound = false;
    }
    return isFriendFound;
  }

尝试一下,让我知道是否有帮助