使用Node js和socket.io在客户端上没有触发事件

时间:2017-03-01 15:55:53

标签: javascript node.js socket.io

我将图像上传到服务器时遇到问题,当我这样做时,我想将此事件发送到房间" 1室"

 `io.sockets.in("1room").emit('image_added','OK');`

问题是,事件没有在客户端上触发,但如果我重新加载页面是,则触发该事件。

HTML

 <form ref='uploadForm' 
      id='uploadForm' 
      action='http://localhost:3000/upload' 
      method='post' 
      encType="multipart/form-data">
       <input type="file" name="sampleFile" />
       <input type='submit' value='Upload!' />
 </form>     

SERVER

io.sockets.on('connection', function(socket){

   socket.join("1room");

});

    app.post('/upload', function(req, res) {

      if (!req.files)
        return res.status(400).send('No files were uploaded.');

      let sampleFile = req.files.sampleFile;

      sampleFile.mv('/xampp2/htdocs/pic.jpg', function(err) {

        if (err)
          return res.status(500).send(err);

     if (res.status(200)){
            io.on('connection', function(socket){
            io.sockets.in("1room").emit('image_added','OK'); 
    });

        }

      });

    });

客户端

socket.on('image_added', function(status) {

   alert(status);

});

2 个答案:

答案 0 :(得分:2)

改变这个:

 if (res.status(200)){
    io.on('connection', function(socket){
        io.sockets.in("1room").emit('image_added','OK'); 
    });
}

到此:

 res.status(200);
 io.sockets.in("1room").emit('image_added','OK');  

您不能将io.on('connection', ...)置于app.post()内,也不会想要。正在处理该路由时不会发生该事件。相反,您只想使用io.sockets.in("1room").emit('image_added','OK');

向该房间中的所有连接客户端广播

此外,if (res.status(200))没有意义,因为res.status()只返回res对象,因此总是如此。

答案 1 :(得分:0)

很简单,只有在全新的连接事件发生时才发送。

io.sockets.in("1room").emit('image_added','OK')

删除连接事件。