我是socket.io
的新用户,我正在尝试将特定数据推送到不同的客户端基于他们在数据库中的信息。我用socket.io
做了一个非常简单的练习:
```
//app.js
const Koa = require(‘koa');
const router = require('koa-router')();
const server = require('koa-static');
const app = new Koa();
const http = require('http').createServer(app.callback());
const io = require('socket.io')(http);
app.use(server(__dirname + '/'));
app.use(require('./controller')());
io.on('connection', (socket) => {
//each client just take its specific information
socket.on('messge', (msg) => {
io.to(socket.id).emit('message', socket.id);
});
})
app.io = io; //trying to let controller use 'io' by 'app.io'
http.listen(9000);
```
上面的代码效果很好,至少那些客户端只是得到他们的socket.id
并且不向其他人发射。
但是所有主要数据处理都在控制器中,因此我使用app.io=io
将socket.io
传递给控制器。
当我在控制器中使用io
时:
```
//a_controller.js
let fnTestSocketIO = async(ctx, next) => {
let socketIO = ctx.app.io;
//just use like in the app.js, but process doesn't go in this part
socketIO.on('message', (socket) => {
console.log('id', socket.id);
});
ctx.response.body = "response from 'test socket.io'";
}
...
module.exports = {
"GET /test/socket-io": fnTestSocketIO,
}
```
不幸的是,socketIO.on(...)
不起作用。
io
,则app.js
中的message
会发出消息。io
中发送请求时,/test/socket-io
没有显示任何内容。 (它可以回应,但不能过去socketIO.on(...)
)我可以使用:
```
//a_controller.js
let fnTestSocketIO = async(ctx, next) => {
let socketIO = ctx.app.io;
socketIO.emit('message', 'something');
ctx.response.body = "response from 'test socket.io'";
}
```
发出,但它会将数据发送到所有客户端。 我想我需要socket id来发送数据,所以我试过了:
```
//a_controller.js
let sid = null;
for(let id in socketIO.sockets.sockets) {
sid = id;
}
```
获取套接字的id,但显然这是一个不好的做法。
这有什么打击?非常感谢你。