Я создаю приложение со списком задач для своего проекта. Я использую socket.io, node.js для бэкэнда. У меня есть модуль Todo, а также модуль друзей
В модуле «Друзья». Я хочу, чтобы пользователь мог отправить запрос на добавление в друзья от клиента (событие emit socket.io). По запросу socket.io прослушивает событие и отправляет событие eventemitter, сохраняет данные в базе данных, а также отправляет уведомление пользователю.
socket.on('send-friend-request', (data)=>{
setTimeout(()=>{
eventEmitter.emit('send-request', data)
}, 2000)
}) // end socket on send friend request
eventEmitter.on('send-request', (data)=>{
let newFriendRequest = {
friendId: data.friendId,
friendName: data.friendName,
email: data.email,
mobileNumber: data.mobileNumber,
requestStatus: 'pending',
modifiedOn: time.now()
}
UserModel.findOne({'friends.friendId': socket.userId}, (err, result)=>{
if(err){
logger.error(err, 'socketLib: evenetEmitter - send-request', 6)
}else if(check.isEmpty(result)){
let options = {
$push: {
friends:{
$each: [newFriendRequest],
$sort: {modifiedOn: -1}
}
}
}
UserModel.findOneAndUpdate({userId: socket.userId}, options)
.select('-friends')
.exec((err, result)=>{
if(err){
console.log(err)
} else {
result.friendId = data.friendId
console.log('Friend Request Send')
let notify = new NotificationModel({
notificationId: shortid.generate(),
senderId: socket.userId,
receiverId: data.friendId,
message: `You Have Received A New Friend Request`,
notifiedOn: time.now()
})
socket.emit(data.friendId, notify)
setTimeout(()=>{
eventEmitter.emit('recieve-request', result)
}, 4000)
setTimeout(()=>{
notify.save((err, newNotification)=>{
if(err){
console.log(err)
} else {
console.log("New notification Saved")
}
})
}, 5000)
}
})
}else {
logger.error("User is already a friend", "socketLib: evenetEmitter - send-request", 6)
}
})
}) // end eventemitter on send-request
eventEmitter.on('recieve-request', (user)=>{
let receievedRequest = {
friendId: user.userId,
friendName: user.firstName+' '+user.lastName,
email: user.email,
mobileNumber: user.mobileNumber,
requestStatus: 'pending',
modifiedOn: time.now()
}
let options = {
$push: {
friends: {
$each: [receievedRequest],
$sort: {modifiedOn: -1}
}
}
}
UserModel.updateOne({userId: user.friendId}, options, {multi: true}, (err, result)=>{
if(err){
console.log(err)
} else {
console.log("Friend Request Received")
}
})
}) // end eventemitter on recieve-request
Однако это событие вызывается несколько раз, и в базе данных создается несколько данных. А также многократные уведомления отправляются клиенту.
см. Вывод консоли ниже
Friend Request Send
Friend Request Send
Friend Request Received
Friend Request Received
Friend Request Received
Friend Request Received
New notification Saved
New notification Saved
Как это можно исправить? чтобы событие не вызывалось несколько раз и чтобы избежать создания нескольких данных