我想在调用某个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
答案 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);