1
votes

I am using loopback API. server.js (server -> server.js) is as below:

var loopback = require('loopback');
var boot = require('loopback-boot');
var app = module.exports = loopback();

app.start = function () {
  return app.listen(function () {
    app.emit('started');
    console.log('Web server listening at: %s', app.get('url'));
  });
};

boot(app, __dirname, function (err) {
  if (err) throw err;

  if (require.main === module) {
    //app.start();
    app.io = require('socket.io')(app.start());

    app.io.on('connection', function (socket) {
      console.log('a user connected');
      socket.on('disconnect', function () {
      console.log('user disconnected');
    });
  })
  }
});

I have created one model file mock.js (common -> models -> mock.js) which contains one method which send pie chart data periodically.

module.exports = function (Mock) {

Mock.getPieChartData = function (cb) {
    var appIO = Mock.app.io
    console.log('Inside Mock->getPieChartData')
    var interval = setInterval(function () {
        appIO.emit("pieData", getPieChartData());
    }, 3000)

    cb(null, getPieChartData())
}

function getPieChartData() {
.......
}
}

Problem is, appIO.emit sends data to all connected clients. I just want to send data to only connected client. not all. If I do socket.emit in server.js inside connection function then it works fine. But I want to emit data from method inside model (mock.js -> Mock.getPieChartData). I am not getting current socket instance inside this method.

1

1 Answers

2
votes

After some research, found an answer to my question above. In server.js, set a variable for current socket Id and export it:

app.io.on('connection', function (socket) {
  console.log('socket.io - a user connected');
  module.exports = { currentSocketId: socket.id };
  socket.on('disconnect', function () {
    console.log('socket.io - user disconnected');
  });
})

Inside mock.js, use this current socket Id to get current socket object and then emit using that.

    Mock.getPieChartData = function (cb) {

    var sourceFile = require('../pubsub/pubsub.js');

    var appIO = Mock.app.io
    console.log('Inside Mock->getPieChartData')

    var currentsocket = appIO.sockets.clients().sockets[sourceFile.currentSocketId]

    var interval = setInterval(function () {
        currentsocket.emit("pieChartData", getPieChartData()) // this emit data to connected socket
        //appIO.emit("pieChartData", getPieChartData()) // this emit data to all connected sockets(clients)
    }, 3000)

    cb(null, getPieChartData())
};