Мне было интересно, почему добавление обратного вызова в функцию 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;
}
Если я удаляю обратный вызов, данные сохраняются только один раз.
РЕДАКТИРОВАТЬ: добавлен второй кусок кода и новый вопрос.
Если кто-то нажмет кнопку, чтобы добавить друга. Друг будет добавлен несколько раз, потому что перед добавлением первого друга и проверкой, которую можно выполнить, чтобы предотвратить это, он уже добавил пользователя несколько раз.
Как я могу убедиться, что он завершает запись в БД, прежде чем разрешить повторный вызов функции?