我正在使用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
)中发出数据。我没有在此方法中获取当前套接字实例。
答案 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())
};