简体   繁体   English

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

[英]how to emit data only to connected socket(client) in loopback API socket.io

I am using loopback API. 我正在使用回送API。 server.js (server -> server.js) is as below: server.js(服务器-> 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');
    });
  })
  }
});

I have created one model file mock.js (common -> models -> mock.js) which contains one method which send pie chart data periodically. 我创建了一个模型文件mock.js(常用->模型->嘲笑.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() {
.......
}
}

Problem is, appIO.emit sends data to all connected clients. 问题是, appIO.emit将数据发送到所有连接的客户端。 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. 如果我在连接功能内的server.js中执行socket.emit ,那么它将正常工作。 But I want to emit data from method inside model ( mock.js -> Mock.getPieChartData ). 但是我想从模型内部的方法中发出数据( 嘲笑.js- > Mock.getPieChartData )。 I am not getting current socket instance inside this method. 我没有在此方法内获取当前的套接字实例。

After some research, found an answer to my question above. 经过研究,在上面找到了我的问题的答案。 In server.js, set a variable for current socket Id and export it: 在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');
  });
})

Inside mock.js, use this current socket Id to get current socket object and then emit using that. 在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())
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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