javascript - Socket.io 和 Node/Express - 超出最大调用堆栈大小

标签 javascript node.js reactjs socket.io

我在前端使用react,在后端使用node/express。我正在尝试集成套接字,以使在一个客户端上完成的任何单击事件都会在所有其他客户端上发出。 (例如,如果有人点击“播放歌曲”,它将触发所有其他用户播放该歌曲的点击事件)。

当我单击某些内容时,它不会到达服务器的套接字监听器,并在浏览器控制台中显示超出最大调用堆栈大小。

PS:这是我第一次导入代码,它不让我缩进!

服务器端代码:

var express = require('express');
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);
server.listen(8000);
io.on('connection', function (socket) {
    console.log('socket connected!');
    socket.on('myClick', function (data) {
        console.log('event hit Server');
        socket.broadcast.emit('myClick', data);
    });
    socket.on('disconnect', function () {
        io.emit('user disconnected');
    });
});

客户端代码:

$(document).ready(function () {
    var socket = io('http://localhost:8000');

    $(document).on('click', function(event){
        console.log('Something has been clicked!');
        console.dir(event.target);
        socket.emit('myClick', {id: event.target});
    });
    socket.on('myClick', function (data) {
        console.log('event hit other client');
        $(data.id).trigger('click');
    });
});

最佳答案

您的错误出现在客户端,导致调用无限循环:

  1. 当点击 DOM 时,您的“点击”函数就会被触发。
  2. 该函数发出套接字的“myClick”事件,因此“myClick”函数被触发。
  3. 在此函数内,您触发了一个点击事件,因此,之前的函数再次被触发,并且您无限地返回到步骤 1。

解决方案:更换

$(document).on('click', function(event){

使用更具体的内容,例如必须触发事件的元素的 id 或类:

$("#elementId").on('click', function(event){

关于javascript - Socket.io 和 Node/Express - 超出最大调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621571/

相关文章:

javascript - 如何使用 Meteor JS 访问服务器端代码中的客户端变量?

javascript - 如何在 ionic 4 中使用 alertcontroller 返回 promise ?

javascript - 一个函数中的严格模式是否会影响它调用的函数?

javascript - 这个错误重要吗?组件不受控制到受控

jquery - 在 ReactJS 中将表导出为 xls 表

reactjs - react typescript 如何键入一个 hoc

javascript - 如何使用javascript中的正则表达式从颜色代码中删除 "#"?

javascript - Socket.Io 传输轮询错误

json - 如果 URL 是动态的,如何将 Node.js 应用程序部署到 Heroku

ios - 安全文件直接上传到 s3 或服务器到 s3(从 iOS 应用程序)