我正在建立一个系统,我有一个带有客户端界面的独立管理仪表板。前端建立在angularjs上,我使用后端的样板Node.js / Express服务器,我已连接到MySql数据库。
每次客户端从客户端界面提交新信息时,都会将其提交给服务器,由路由器路由到控制器,控制器将数据传递给模型并将其上传到数据库。
我想做的是每次调用处理请求的控制器时,请求完成后,我想通过socket.io将新数据发送到管理仪表板。
我的挑战是我不知道如何从控制器内访问套接字???任何帮助将不胜感激!
答案 0 :(得分:1)
是的,这很棘手。像Express一样,Socket.io是一个自己的请求处理库。它们都是独立工作的,因此没有简单的方法来切换"从Express到Socket。
但是,如果您可以唯一地标识客户端,则可以将其socket.id
存储在某处,然后您可以使用Express控制器中的io
向该客户端的套接字发送。
您可以执行与io.to(socket.id).emit
相同的socket.emit
,只要您拥有socket.id
,就可以使用全局可用的io
向其发出。
我在大多数应用中使用Passport身份验证,因此我发现使用req.user
是唯一标识客户端的好方法。它甚至可以是幕后的"伪"通过为每个客户端生成随机用户ID /传递进行身份验证
然后有passport.socketio模块从socket.io连接访问passport.js用户信息。 Here's an article from the author that goes into the details of it all
将它们组合使用,您可以使用user
对象来存储和访问socket.id
,并使用它通过socket.io与客户端进行通信
io.on('connection', function(socket){
var user = socket.request.user; // from socketio.passport
// store the socket.id inside the user so it can be retrieved from Express
user.socketid = socket.id;
});
app.post('/form', function(req, res, next){
var user = req.user; // from Passport
var socketid = user.socket.id // from socket above
var data = req.body;
doStuff(data);
io.to(socketid).emit('done');
});