使用Node.js调用.send(data)时,在HTML5 websocket上接收“Error:InvalidStateError:DOM Exception 11”

时间:2013-05-04 15:39:21

标签: html5 node.js websocket socket.io

我目前正在尝试使用node.js开发一个小型聊天应用程序。这是我的第一个节点项目,但我收到错误,我不确定如何解决它。

我在下面的节点中写了一个简单的聊天服务器。

var port = 3000;
var net = require('net');
var clients = [];

var server = net.createServer(function (socket) {
  clients.push(socket);
  bindEventHandlers(socket);
});

setInterval(function(){
  console.log(clients.length);
}, 2000);

server.listen(port);
console.log('Server is listening on localhost:' + port);

function bindEventHandlers(socket) {
  socket.on('data', function(data){
    broadcastDataToAllClient(data, socket);
  });
  socket.on('close', function(){
    clients.splice(clients.indexOf(socket), 1);
  });
  socket.on('error', function(){
    console.log('Known Error << "It\'s a feature!"');
  })
}

function broadcastDataToAllClient(data, socket) {
  for (var client in clients) {
      if(clients[client] == socket){ continue; }
      clients[client].write(data);
  }
}

快速客户端界面

<!DOCTYPE HTML>
<html>
    <head>
        <title>Node.js Chat Server</title>
        <script type="text/javascript">
            function init(){
                if (window.WebSocket) {
                    var input = document.getElementById('messageBox');
                    var webSocket = new WebSocket("ws://localhost:3000/");
                    input.onkeyup = function(e){
                        if(e.keyCode == 13) {
                            console.log('sending message');
                            webSocket.send('some data');
                        }
                    };
                    webSocket.onopen = function(e){
                        alert('Open');
                    }
                    webSocket.onmessage = function(e){
                        console.log('Message');
                    }
                    webSocket.onclose = function(e){
                        console.log('Close');
                    }
                    webSocket.onerror = function(e){
                        console.log('Error');
                    }   
                } else {
                    console.log('unable to support :(');
                }
            }
        </script>
    </head>
    <body lang="en" onload="init();">
        <h1>Node.js Chat Server</h1>
        <h3>Welcome to this simple chat server!</h3>
        <input id="messageBox" size="50" />
    </body>
</html>

当我致电webSocket.send('some data')时,我收到此错误Error: InvalidStateError: DOM Exception 11。在聊天服务器代码中,我有一个循环记录了当前客户端的数量,因此我知道浏览器已连接。

不知道从哪里开始,任何帮助将不胜感激。

亚历

1 个答案:

答案 0 :(得分:7)

执行webSocket.send('some data')时必须建立套接字连接,或者特别是socket.readyState == 1.

您可以查看websocket事件here。为了确保永远不会发生这种情况,您应该在连接打开后使用Socket.onopen事件处理程序发送。你可以这样做。

if(webSocket.readyState == 1){
    webSocket.send('some data');
  }
else{
    webSocket.onopen = function(e){
        webSocket.send('some data');
    }
}