Node.js socket.io仅向socket.on(';connect';)上套接字外部的发送方发出
是否可以仅向发送方全局发出,但在套接字外部发出。on('connect')事件?我正在寻找类似于socket.broadcast.to().emit()的东西,我可以在app.post方法中使用它,它不在connect方法中,所以我不能只使用socket.emitNode.js socket.io仅向socket.on(';connect';)上套接字外部的发送方发出,node.js,express,socket.io,emit,Node.js,Express,Socket.io,Emit,是否可以仅向发送方全局发出,但在套接字外部发出。on('connect')事件?我正在寻找类似于socket.broadcast.to().emit()的东西,我可以在app.post方法中使用它,它不在connect方法中,所以我不能只使用socket.emit app.post('/room', function(req, res) { io.sockets.emit('something'); }); 我只想向发送者发送的“某物” 我的代
app.post('/room', function(req, res) {
io.sockets.emit('something');
});
我只想向发送者发送的“某物”
我的代码:
socket_id;
app.post('/room', function(req, res) {
if (req.body.user == ''){
io.sockets.socket(socket_id).emit('usernameError', 'Type your username');
}
else if (users[req.body.user] !== undefined ) {
io.sockets.socket(socket_id).emit('usernameError', 'Username exists.');
}
else{
users[req.body.user] = req.body.user;
user = req.body.user;
io.sockets.emit('newUser', user+' join to the room');
res.render('room');
}
});
io.sockets.on('connection', function(socket) {
socket.username = user;
socket.join('room1');
socket.id = socket_id;
});
据我所知,您想向刚刚来到
/room
页面的用户发送“某物”,对吗?如果是这样,您不能在
app.post
方法中执行此操作,因为此代码将在客户端收到HTML代码之前执行,
因此,客户端和服务器之间的握手将不会建立
我认为最好的解决方案是仅在/room
页面的客户端执行以下代码:
var socket = io.connect('/'); //your socket.io connection (may be different)
socket.on('something', function(data) {
console.log(data);
});
socket.emit('i_am_room_page'); //tell server we are on /room page
在服务器上:
io.sockets.on('connection', function(socket) {
socket.on('i_am_room_page', function(data) {
socket.emit('something', {your: 'data'});
});
});
希望这对您有所帮助如果您可以将发送方的socektID存储在一个变量中,那么您可以在app.post方法中发送到特定的客户端。这样做:
var id;
io.sockets.on('connection', function(socket){
socket.on('some event'){
id = socket.id;
}
});
并在app.post方法中执行此操作:
app.post('/room', function(req, res) {
io.sockets.socket(socketid).emit('event name', {data: yourData});
});
虽然我已经提出了这个解决方案,但您的方法似乎不太令人信服。您是使用AJAX还是HTML表单向
/room
发送请求?我正在使用Jade模板:form(name=“input”,action='/room',method='post')我更新了代码。你的想法很好,但我想在app.post中完成所有这些,因为正如你所看到的,我在app.post中有一个小的验证。这听起来不错,但socketID是在客户端连接时生成的,所以首先将完成app.post。请看我的更新代码。也许app.post可以在io.sockets.on('connection')或之后?这是正确的方法吗?您是否向客户端呈现两个页面?我的意思是,第一个客户端点击一个特定的URL,然后你呈现,让我们假设,login.jade,在验证之后,你呈现room.jade?是的,索引是一个起始页。app.get('/',函数(req,res){res.render('index');});有我的登录表单,然后不要在索引页中使用套接字,使用AJAX请求,使用JSON发送登录验证响应,如res.JSON(500,{error:'err….});如果用户被验证,则将房间页面呈现给他,并在该页面中使用套接字。如果你不明白这一点,请让我知道,然后我会给你答案与代码我有点困惑,将感谢你的答案与代码