Почему использование обратного вызова mongoose приводит к двойному сохранению данных? - PullRequest
0 голосов
/ 15 января 2019

Мне было интересно, почему добавление обратного вызова в функцию 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;
  }

Если я удаляю обратный вызов, данные сохраняются только один раз.

РЕДАКТИРОВАТЬ: добавлен второй кусок кода и новый вопрос. Если кто-то нажмет кнопку, чтобы добавить друга. Друг будет добавлен несколько раз, потому что перед добавлением первого друга и проверкой, которую можно выполнить, чтобы предотвратить это, он уже добавил пользователя несколько раз.

Как я могу убедиться, что он завершает запись в БД, прежде чем разрешить повторный вызов функции?

1 Ответ

0 голосов
/ 15 января 2019

Возможно, проблема в методе isPersonAlreadyFriend, потому что вы пытаетесь вызвать его с помощью async await, но затем вы передаете обратный вызов, что заставляет метод не возвращать обещание. Правильный способ использовать обещания с mongodb должен выглядеть примерно так:

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

Попробуйте с этим и дайте мне знать, если это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...