访问映射时超出Javascript最大调用堆栈大小错误
我正在使用socket.io进行一个项目。当我单击一个按钮时,我应该被添加到存储在地图中的特定服务器。当我单击按钮时,调用被发送到服务器,但随后我得到一个最大调用堆栈大小超出错误。我把范围缩小到我的访问映射时超出Javascript最大调用堆栈大小错误,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我正在使用socket.io进行一个项目。当我单击一个按钮时,我应该被添加到存储在地图中的特定服务器。当我单击按钮时,调用被发送到服务器,但随后我得到一个最大调用堆栈大小超出错误。我把范围缩小到我的sendToServer函数 客户端js文件 var socket; let id; let state = "MENU"; var menu, serverlist, game; let servers; var isMobile; var dispX, dispY; var touch = f
sendToServer
函数
客户端js文件
var socket;
let id;
let state = "MENU";
var menu, serverlist, game;
let servers;
var isMobile;
var dispX, dispY;
var touch = false;
function setup() {
declare();
createCanvas(dispX, dispY);
menu = new Menu();
game = new Game();
serverlist = new List();
console.log("Hello World!");
socket = io.connect("https://hidy.glitch.me:443");
socket.emit("start", "Hello Server!");
id = socket.emit('getid');
socket.on("get", function(data) {
if (state == "SERVERLIST") {
servers = new Map(Object.entries(data));
serverlist.loopServers();
}
});
socket.on("heartbeat", function(data) {
console.log(data);
});
}
function draw() {
if (state == "GAME") {
game.show();
} else if (state == "SERVERLIST") {
serverlist.show();
} else {
menu.show();
}
updateTouch();
}
function mouseClicked() {
if (state == "MENU") {
menu.evalClick();
}
if (state == "SERVERLIST") {
serverlist.evalClick();
}
}
function touchStarted(){
touch = true;
if (isMobile) {
if (state == "MENU") {
menu.evalClick();
}
if (state == "SERVERLIST") {
serverlist.evalClick();
}
}
}
function updateTouch() {
if (touch == true) {
}
}
function touchEnded() {
touch = false;
}
function emitToServer(func, msg) {
socket.emit(func, msg);
}
function emitKeyValue(key, value) {
socket.emit('create', key, value);
}
function sendToServer(sid) {
console.log('s');
socket.emit('addtoserver', sid, socket);
console.log('h');
}
function declare() {
isMobile = (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
if (!isMobile) {
dispX = displayWidth / 2;
dispY = displayHeight / 2;
} else {
dispX = displayHeight;
dispY = displayWidth - 109;
}
}
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
addToServer函数
socket.on('addtoserver', function(sid, socket) {
console.log('Adding socket to ' + servers.get(sid)); // I don't even get this message printed to console
servers.get(sid).addClient(socket);
});
错误为的完整类:
class List {
constructor() {
this.back = new Button(50, 25, 100, 50, "Menu", 30, 100, 200, 50, 170, 123, 195);
this.clear = new Button(width - 50, 25, 100, 50, "Clear", 30, 100, 200, 50, 170, 123, 195);
this.add = new Button(width / 2, 25, 200, 50, "Create Game", 30, 100, 200, 50, 170, 123, 195);
this.list = [];
this.loopServers();
this.array = new ARList(width / 2, 100, 100, 25, this.list, 20, 30, 100, 200, 50, 170, 123, 195);
}
show() {
background(83, 28, 179);
this.back.show();
this.clear.show();
this.add.show();
this.array.show();
}
loopServers() {
this.list = [];
if (servers != null) {
this.list = Array.from(servers.keys());
this.array = new ARList(width / 2, 100, 200, 25, this.list, 20, 30, 100, 200, 50, 170, 123, 195);
}
}
evalClick() {
if (this.back.clicked()) {
state = "MENU";
}
if (this.clear.clicked()) {
emitToServer('clear');
this.loopServers();
}
if (this.add.clicked()) {
var sid = Math.random().toString(36).substr(2, 5);
emitToServer('create', sid);
sendToServer(sid);
game = emitToServer('getserver', sid);
state = "GAME";
}
if (this.array.clicked() != null) {
sendToServer(this.array.clicked().getText());
}
}
}
HTML文件:
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.sound.min.js"></script>
<script src="https://cdn.JsDelivr.net/gh/bmoren/p5.collide2D/p5.collide2d.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.dev.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" />
<meta charset="utf-8" />
</head>
<body bgcolor="gray">
<script src="client.js"></script>
<script src="/menu.js"></script>
<script src="/game.js"></script>
<script src="/server.js"></script>
<script src="/list.js"></script>
<script src="/button.js"></script>
<script src="/label.js"></script>
<script src="/arlist.js"></script>
</body>
</html>
要澄清的是,错误是在客户端还是在服务器上?这是因为您的代码在客户端上进行无限递归-side@JatinParmar-您可以在发布的代码中看到吗?@Bravo no,但在javascript中,这种错误是由于recursion@JatinParmar无限递归在哪里?按钮点击只触发一次,所以我不知道怎么会有无限递归。
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.sound.min.js"></script>
<script src="https://cdn.JsDelivr.net/gh/bmoren/p5.collide2D/p5.collide2d.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.dev.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" />
<meta charset="utf-8" />
</head>
<body bgcolor="gray">
<script src="client.js"></script>
<script src="/menu.js"></script>
<script src="/game.js"></script>
<script src="/server.js"></script>
<script src="/list.js"></script>
<script src="/button.js"></script>
<script src="/label.js"></script>
<script src="/arlist.js"></script>
</body>
</html>
// Using express: http://expressjs.com/
var express = require('express');
const GameServer = require('./gameserver');
// Create the app
var app = express();
var servers = new Map();
// Set up the server
// process.env.PORT is related to deploying on heroku
var server = app.listen(process.env.PORT || window.location, listen);
// This call back just tells us that the server has started
function listen() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://' + host + ':' + port);
}
// You need to add the folders that you want to access to here
app.use(express.static('public'));
app.use(express.static('public/game'));
app.use(express.static('public/menu'));
app.use(express.static('public/serverlist'));
app.use(express.static('public/server'));
app.use(express.static('utils'));
// WebSocket Portion
// WebSockets work with the HTTP server
var io = require('socket.io')(server);
// The heartbeat is sent to all clients every X seconds
// We can use the heartbeat as a way to sync data among users
// We will need 2 heartbeats, the first one from the client to the server with their data packet (we will need a way of shortening the data to a small packet to avoid loss-of-data)
// the second one from the server to all clients with the data packets (we will need some way of parsing the received data)
setInterval(heartbeat, 1000);
setInterval(serv, 50);
function heartbeat() {
io.sockets.emit('heartbeat', 'Hello');
}
function serv() {
io.sockets.emit('get', Array.from(servers.entries()).reduce((main, [key, value]) => ({...main, [key]: value}), {}));
}
// Sends the user to index.html on connect
app.get("/", function(request, response) {
response.sendFile(__dirname + "/views/view.html");
});
// Register a callback function to run when we have an individual connection
// This is run for each individual user that connects
io.sockets.on('connection',
// We are given a websocket object in our function
function(socket) {
console.log("We have a new client: " + socket.id);
socket.on('getid', function() { return socket.id });
socket.on('start',
function(data) {
console.log('Received data ' + data)
}
);
socket.on('update',
function(data) {
console.log('Updating ' + data);
}
);
socket.on('create', function(id) {
console.log('3');
console.log("Creating server " + id);
servers.set(id, new GameServer(id));
console.log('d');
});
socket.on('getserver', function(id) {
console.log('2');
return servers.get(id);
});
socket.on('addtoserver', function(sid, socket) {
console.log('1');
console.log('Adding socket to ' + servers.get(sid));
servers.get(sid).addClient(socket);
});
socket.on('clear', function() {
servers = new Map();
});
socket.on('disconnect', function() {
console.log("Client has disconnected");
});
}
);