Nodejs事件多次发出

时间:2017-08-25 12:40:45

标签: node.js eventemitter

export function postComment(req, res) {

const user = decodeToken(req);

let saveComment, saveJob, saveUser, activity, jobUser;

function pushToJob(comment) {
    saveComment = comment;
    Job.findById(req.params.id)
        .then((data) => {
            job = data;
            data.comments.push(saveComment._id)
            return data.save()
        }).catch((err) => {
            throw new Error(`The error at pushing to job is ${err}`)
        })
}

function updateCommentWithJobId(job) {
    saveComment.jobId = {
        _id: job._id,
        title: job.title
    }
    return saveComment.save()
}

function addActivityToUser(comment) {
    saveComment = comment;
    User.findById(user._id)
        .then((data) => {
            saveUser = data;
            activity = {
                activity: 'comment',
                comment: saveComment._id,
                jobAuthor: {
                    _id: saveJob.userId._id,
                    name: saveJob.userId.name
                }
            }
            saveUser.activities.unshift(activity);
            return saveUser.save()
        }).catch((err) => {
            throw new Error(`The error at addActivityToUser is ${err}`)
        })
}

function addUserToComment(user) {
    saveUser = user;
    saveComment.userId = {
        _id: saveUser._id,
        name: saveUser.name,
        profile_image: saveUser.profile_image
    }

    return saveComment.save()
}

function addActivityToJobUser(comment) {
    saveComment = comment
    User.findById(saveJob.userId)
        .then((data) => {
            if (saveJob.userId !== user._id) {
                data.activities.unshift(activity);
            }

            return data.save()
        }).catch((err) => {
            throw new Error(`The error at addActivityToJobUser ${err}`)
        })
}

function emitCommentEvent(user) {
    jobUser = user
    let comment = {
        userId: saveJob.userId,
        room: saveJob.room,
        comment: saveComment
    }

    comEmit.emit('comment', comment);
    return res.status(200).json({ message: 'Comment posted successfully' });
}

Comment.create(req.body)
    .then(pushToJob)
    .then(updateCommentWithJobId)
    .then(addActivityToUser)
    .then(addUserToComment)
    .then(addActivityToJobUser)
    .then(emitCommentEvent)
    .catch((err) => {
        res.status(500).json({ message: 'An error occurred while posting your comment, please try again' })
    })
}

这是我的一个api的控制器,每当有人在作者的帖子上发表评论时,我就会发出comment事件。问题是同一个事件多次被触发。行console.log('about to emit comment')只触发一次。

我尝试寻找解决方案,但尚未找到任何答案。

这种行为可能是什么原因?

编辑:这是该事件的倾听者。

  socketio.on('connection', function(socket){
      Chat.find({})
          .then((data)=>{

                //Some independent socket events

                comEmit.on('comment', (data) => {
                    console.log('comment posted ', data)
                    if (userId === data.userId) {
                        socket.join(data.room);
                    }
                    socket.in(data.room).emit('commentPosted', data.comment)
                })
           })
   })

由于我可以检查日志,'comment posted'会多次记录并且数据相同。

1 个答案:

答案 0 :(得分:1)

我会将我的评论写成答案。

socketio.on('connection', ...)处理程序中,您正在执行:

comEmit.on('comment', (data) => { ...});

由于只有一个comEmit对象,这意味着每个传入的socket.io连接都会导致您为comment事件添加新的重复事件处理程序。所以,你实际上并没有像你想的那样得到重复的事件,但是有重复的事件处理程序。因此,当触发comment事件时,您将获得该事件的多个重复事件处理程序全部运行。

解决方案通常是静态添加事件处理程序,只需在任何请求处理程序之外设置对象时一次,这样就不会重复,但具体如何做取决于整个代码上下文和您尝试做的事情,我不会完全遵循我们已经看过的有限代码。