socket.io и eventemiiter создают несколько записей - PullRequest
0 голосов
/ 22 мая 2019

Я создаю приложение со списком задач для своего проекта. Я использую 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

Как это можно исправить? чтобы событие не вызывалось несколько раз и чтобы избежать создания нескольких данных

...