简体   繁体   中英

SocketIO: How to emit event in a single request

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)
})

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)

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)
                })
        })
    })
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM