Socket.io在Express Route上发出

时间:2016-06-01 04:43:44

标签: node.js express socket.io

我想在调用某个API路由时向客户端发出一些数据。 我必须在server.js上关注代码

var app  = express();
var http = require('http').Server(app);

var io   = require('socket.io')(http);

io.on('connection', function(socket){
  console.log('a user connected');

  socket.emit('tx', 'msg');

  socket.on('disconnect', function(){
    console.log('user disconnected');
  });
});

现在我有这条路线/测试:

var bsg   = require('./routes/test');

那个档案:

var express      = require('express');
var passport     = require('passport');
var router       = express.Router();

router.get('/test',  function(req, res) {
  //work here
});

module.exports = router;

在客户端:

<script type="text/javascript">
   var socket = io();

   socket.on('tx', function(data) {
     console.log(data);
   });
</script>

对此最好的解决方案是什么?

谢谢!

Express 4 / socket.io 1.4.5

2 个答案:

答案 0 :(得分:33)

io实例附加到您的应用。

app.io = io;

然后您可以通过请求访问它。

router.get('/test',  function(req, res) {
  req.app.io.emit('tx', {key:"value"});
});

如果您希望向单个客户端发送数据,则需要保留某种会话映射以将独立的http请求链接到套接字。会话ID可能不是一对一的映射,因为您可以为一个会话打开许多套接字。最好直接使用socket.io回调处理请求/响应模式。

答案 1 :(得分:5)

您也可以将实例附加到req对象:

app.use(function(req,res,next){
req.io = io;
next();
})

并向一个客户发出

req.io.to(<socketId of cient>).emit(data);