【问题标题】:Receiving "Error: InvalidStateError: DOM Exception 11" on HTML5 websocket when calling .send(data) using Node.js使用 Node.js 调用 .send(data) 时在 HTML5 websocket 上收到“错误:InvalidStateError:DOM 异常 11”
【发布时间】:2013-04-28 20:49:16
【问题描述】:

我目前正在尝试使用 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。在聊天服务器代码中,我有一个循环记录当前客户端的数量,因此我知道浏览器已连接。

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

亚历克斯

【问题讨论】:

    标签: html node.js websocket socket.io


    【解决方案1】:

    当您执行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');
        }
    }
    

    【讨论】:

    • 您好,谢谢您的提示。恐怕它没有用。我通过在 chrome 控制台中调用 .send() 确认了这一点,它产生了同样的错误。
    • 好的,谢谢,这已经消除了错误,但它仍然没有发送消息。我现在认为它没有从服务器获得“完整连接”(如果你知道我的意思),因此它为什么不发送消息。
    • @alexjfno1,很抱歉忽略了它,但 net 模块适用于 TCP 套接字而不是 websocket。这就是为什么您无法连接到节点服务器的原因。你必须使用像 socket.io 这样的东西。更多模块请查看github.com/joyent/node/wiki/modules#web-sockets--ajax
    • 好的,这是有道理的,感谢您的所有帮助和建议。感谢您的链接,我会看看并尝试让一些工作正常。
    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多