我在客户端使用带快递和btford.socket-io的npm socket.io安装了MEAN应用程序。
angular.module('myApp',['btford.socket-io'])
.factory('socket',function(socketFactory){
return socketFactory();
}
).controller('myAppCtrl',['$scope','socket',
function(a,b){
b.on('test',function(data){
console.log(data);
});
}
]);
这是node-express设置:
var app = express(),
server = app.listen(3000);
var socket = require('socket.io'),
io = socket.listen(server);
require('/config/routes/index.js')(app,io);
require('/config/routes/test.js')(app,io);
路由:(config / routes / index.js)
module.exports = function(app,io){
app.get('/',function(req,res){
io.on('connection',function(socket){
socket.join(req.session._id);
});
res.render('index');
});
};
配置/路由/ test.js
module.exports = function(app,io){
app.get('/route1',function(req,res){
io.to(req.session._id).emit('test',{
data : 'Works'
});
res.render('route1');
});
};
A)每当用户转到route1时,就会触发emit事件并将其发送给所有用户。
B)是否有更好的方法可以避免为每个用户使用独特的空间?这不是聊天应用程序,而是实现推送通知
答案 0 :(得分:0)
您需要将socket.io中的连接与请求分开考虑。他们 NOT 以您认为的方式捆绑在一起。您的连接侦听器用于任何连接,而不仅仅是与给定请求相关的连接......您尝试执行的操作不会以这种方式工作。
想象一下,项目的socket.io部分与应用程序的web / express部分中的http请求完全分开。这就是你应该如何看待传递消息。
另外值得考虑的是,如果您使用的是群集或类似的缩放方法,则在一个实例中的默认socket.io设置不会与其他实例通信。
答案 1 :(得分:0)
对于套接字和请求如何工作,您有几个主要的误解。它们是非常独立的操作,并且不像您认为的那样连接。我将尝试用您的代码解释问题。
在这段代码中:
module.exports = function(app,io){
app.get('/',function(req,res){
io.on('connection',function(socket){
socket.join(req.session._id);
});
res.render('index');
});
};
您正在处理/
页面请求,并且每次请求被命中时,您都会为io.on('connection', ...)
添加另一个事件处理程序,因此您可以拥有其中的许多事件处理程序。
此外,如果连接事件发生在用户点击/
页面之前,那么您将完全错过它,并且该套接字不会被放入正确的聊天室。
然后,在这段代码中:
module.exports = function(app,io){
app.get('/route1',function(req,res){
io.to(req.session._id).emit('test',{
data : 'Works'
});
res.render('route1');
});
};
io.to()
采用一个字符串,即聊天室的名称。因此,这将向req.session._id
聊天室中的每个套接字发送一条消息。为此,您必须确保req.session._id
对此用户完全唯一,并且所需用户已通过此名称加入聊天室。这可能有效,但这取决于那些具体的事情是否正确。