【问题标题】:socket.io emit only to sender outside the socket.on('connect')socket.io 仅向 socket.on('connect') 外部的发送者发出
【发布时间】:2014-02-10 19:53:20
【问题描述】:

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

app.post('/room', function(req, res) {   
            io.sockets.emit('something');         

});

'something' 我只想发送给 SENDER

我的代码:

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;   
});

【问题讨论】:

  • 您是否使用 AJAX 或 HTML 表单向/room 发送请求?
  • 我正在使用 Jade 模板:form(name="input", action='/room', method='post')

标签: node.js express socket.io emit


【解决方案1】:

据我了解,您想向刚刚访问 /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'});
  });
});

希望对你有帮助

【讨论】:

  • 我更新了我的代码。你的想法很好,但我想在 app.post 中完成所有这些,因为你可以看到我在那里有一个小的验证。
【解决方案2】:

如果您可以通过某种方式将发送者的 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});
});

虽然我提出了这个解决方案,但你的方法似乎不太有说服力。

【讨论】:

  • 听起来不错,但是当客户端连接时会生成socketID,因此首先会完成app.post。请看我的更新代码。也许 app.post 可以在 io.sockets.on('connection') 内部或之后?这是正确的方法吗?
  • 您是否向客户端呈现两个页面?我的意思是第一个客户端点击一个特定的 URL,然后你渲染,让我们假设,login.jade 并在验证后渲染 room.jade?​​span>
  • 是的,索引是起始页。 app.get('/', function(req, res) { res.render('index'); });有我的登录表单
  • 那么在索引页面中不要使用socket,使用AJAX请求和JSON发送登录验证响应,如res.json(500, {error: 'err.....'});如果用户通过验证,则为他呈现房间页面并在该页面中使用套接字。如果您不明白这一点,请告诉我,然后我会用代码给您答案
  • 我有点困惑,将感谢您的代码回答
猜你喜欢
  • 2014-07-28
  • 2021-04-22
  • 2023-02-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2016-11-10
  • 1970-01-01
相关资源
最近更新 更多