如何仅在loopback API socket.io中向连接的套接字(客户端)发送数据

时间:2017-06-30 22:51:22

标签: javascript node.js socket.io loopbackjs

我正在使用loopback API。 server.js(server - > server.js)如下:

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

我创建了一个模型文件 mock.js(common - > models - > mock.js),其中包含一个定期发送饼图数据的方法。

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() {
.......
}
}

问题是,appIO.emit将数据发送到所有连接的客户端。我只想将数据发送给只连接的客户端。不是全部。如果我在连接函数内的 server.js socket.emit,那么它可以正常工作。但我想从模型内的方法( mock.js - > Mock.getPieChartData)中发出数据。我没有在此方法中获取当前套接字实例。

1 个答案:

答案 0 :(得分:2)

经过一番研究,找到了上述问题的答案。在server.js中,为当前套接字ID设置一个变量并将其导出:

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

在mock.js中,使用当前套接字ID获取当前套接字对象,然后使用它发出。

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