簡體   English   中英

如何僅在回送API socket.io中向連接的套接字(客戶端)發出數據

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

我正在使用回送API。 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');
    });
  })
  }
});

我創建了一個模型文件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() {
.......
}
}

問題是, appIO.emit將數據發送到所有連接的客戶端。 我只想將數據發送到僅已連接的客戶端。 不是全部。 如果我在連接功能內的server.js中執行socket.emit ,那么它將正常工作。 但是我想從模型內部的方法中發出數據( 嘲笑.js- > Mock.getPieChartData )。 我沒有在此方法內獲取當前的套接字實例。

經過研究,在上面找到了我的問題的答案。 在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())
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM