Node.js socket.io仅向socket.on(';connect';)上套接字外部的发送方发出

Node.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'); }); 我只想向发送者发送的“某物” 我的代

是否可以仅向发送方全局发出,但在套接字外部发出。on('connect')事件?我正在寻找类似于socket.broadcast.to().emit()的东西,我可以在app.post方法中使用它,它不在connect方法中,所以我不能只使用socket.emit

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….});如果用户被验证,则将房间页面呈现给他,并在该页面中使用套接字。如果你不明白这一点,请让我知道,然后我会给你答案与代码我有点困惑,将感谢你的答案与代码