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'
会多次记录并且数据相同。
答案 0 :(得分:1)
我会将我的评论写成答案。
在socketio.on('connection', ...)
处理程序中,您正在执行:
comEmit.on('comment', (data) => { ...});
由于只有一个comEmit
对象,这意味着每个传入的socket.io连接都会导致您为comment
事件添加新的重复事件处理程序。所以,你实际上并没有像你想的那样得到重复的事件,但是有重复的事件处理程序。因此,当触发comment
事件时,您将获得该事件的多个重复事件处理程序全部运行。
解决方案通常是静态添加事件处理程序,只需在任何请求处理程序之外设置对象时一次,这样就不会重复,但具体如何做取决于整个代码上下文和您尝试做的事情,我不会完全遵循我们已经看过的有限代码。