Reputation: 9523
I have an issue about emiting event in a single request. I have read many issues in Stackoverflow but I can make my case success. Please check for me.
My server.js
:
const express = require('express');
const app = express();
const io = require('socket.io').listen(server)
const socketEvents = require('./socketEvents')
server.listen(PORT, err => {
if (err) {
console.log('Cannot run SOCKET!')
} else {
app.io = io
socketEvents(io)
}
})
Then, this is my socketEvents.js
const socketEvents = (io) => {
io.on('connection', (socket) => {
const socketId = socket.id
console.log(`User with ID ${socketId} connected`)
socket.on('disconnect', () => {
console.log(`SocketId: ${socket.id} disconnected`)
})
socket.on('openRoom', function(payload) {
var roomID = payload.room_id
var user = payload.user
console.log('User', 'with socket', socket.id, 'watching', 'room', roomID);
socket.join(roomID);
});
socket.on('leaveRoom', function(uid) {
console.log('User', socket.id, 'leave', uid, 'room');
socket.leave(uid);
});
socket.on('send-message', (payload) => {
console.log('User', socket.id, 'send a message data to room', payload.room_id);
MessageCtr.add_message(payload)
.then(response => {
io.to(payload.room).emit("updateRoom_" + payload.room, response)
})
})
})
}
module.exports = socketEvents
I want to emit event: io.to(payload.room).emit("updateRoom_" + payload.room, response)
when Send request with method POST:
router.post('/new', function(req, res) {
MessageCtr.add_message({...req.body, 'user_id': req.user.user_id})
.then(response => {
req.app.io.to(req.body.room_id).emit("updateRoom_" + req.body.room_id, response)
res.json({ 'success': true, 'data': response.dataValues });
})
});
module.exports = router;
This line req.app.io.to(req.body.room_id).emit("updateRoom_" + req.body.room_id, response)
is not work. Please give me reason for it. Thank in advance!
My Client (VueJS):
this.$socket.on('updateRoom_' + this.room.id, function (payload) {
console.log(payload);
vm.$store.commit('chat/SEND_CHAT', payload)
})
Upvotes: 0
Views: 678
Reputation: 196
Utilize Nodejs event emitters to solve this problem.
In your Api you can add event emitter(process.emit).
router.post('/new', function (req, res) {
MessageCtr.add_message({ ...req.body, 'user_id': req.user.user_id })
.then(response => {
// req.app.io.to(req.body.room_id).emit("updateRoom_" + req.body.room_id, response)
process.emit("send_socket_response", ({ room_id: req.body.room_id, response }));
res.json({ 'success': true, 'data': response.dataValues });
})
});
and in your socket code file add listener (process.on)
const socketEvents = (io) => {
process.on("send_socket_response", (data) => {
let room_id = data.room_id;
let response = data.response;
io.to(room_id).emit("updateRoom_" + room_id, response)
})
io.on('connection', (socket) => {
const socketId = socket.id
console.log(`User with ID ${socketId} connected`)
socket.on('disconnect', () => {
console.log(`SocketId: ${socket.id} disconnected`)
})
socket.on('openRoom', function (payload) {
var roomID = payload.room_id
var user = payload.user
console.log('User', 'with socket', socket.id, 'watching', 'room', roomID);
socket.join(roomID);
});
socket.on('leaveRoom', function (uid) {
console.log('User', socket.id, 'leave', uid, 'room');
socket.leave(uid);
});
socket.on('send-message', (payload) => {
console.log('User', socket.id, 'send a message data to room', payload.room_id);
MessageCtr.add_message(payload)
.then(response => {
io.to(payload.room).emit("updateRoom_" + payload.room, response)
})
})
})
}
Upvotes: 1
Reputation: 522
Can you try this,use global variable
app.io = io
replace with global.io = io
global.io.to(req.body.room_id).emit("updateRoom_" + req.body.room_id, response);
Instead of
app.io.to(req.body.room_id).emit("updateRoom_" + req.body.room_id, response)
Upvotes: 1