如何在环回中仅向连接的套接字(客户端)发送数据 API socket.io
how to emit data only to connected socket(client) in loopback API socket.io
我正在使用环回 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(通用 -> 模型 -> 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
)。我没有在此方法中获取当前套接字实例。
经过一番研究,找到了我上面问题的答案。在server.js中,为当前socket 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())
};
我正在使用环回 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(通用 -> 模型 -> 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
)。我没有在此方法中获取当前套接字实例。
经过一番研究,找到了我上面问题的答案。在server.js中,为当前socket 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())
};