无法在控制器

时间:2017-04-24 21:01:43

标签: node.js socket.io

我是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=iosocket.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(...)不起作用。

预期行为

  1. 纱线开始
  2. 如果客户端发出io,则app.js中的
  3. message会发出消息。
  4. 但是当我在api io中发送请求时,/test/socket-io没有显示任何内容。 (它可以回应,但不能过去socketIO.on(...)
  5. 设置

    • 操作系统:Ubuntu 14.04
    • 浏览器:Google Chrome 58
    • socket.io版本:1.7.3

    其他信息(例如堆栈跟踪,相关问题,如何修复的建议)

    我可以使用:

    ```
    //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,但显然这是一个不好的做法。

    这有什么打击?非常感谢你。

0 个答案:

没有答案