Не удается выполнить установку node.js/server.js
Я немного застрял прямо сейчас и надеюсь, что кто-то может пролить свет. Я относительно новичок в сокетах вообще, но программировал в javascript в течение нескольких лет, хотя и был настолько глубоким, насколько это необходимо для выполнения поставленной задачи. В результате мое понимание некоторых концепций, связанных с кучей javascript-стека, и сокетов в целом несколько ограничено. Хорошо. Здесь ситуация:
Я создал приложение, предназначенное для простого увеличения счетчика на нескольких машинах. Несколько пользователей могут нажать кнопку "Далее", и она будет мгновенно обновляться на всех машинах. Когда вы впервые подключаетесь, он извлекает текущий номер и вырывает его локально.
Я создал сервер здесь:
var io = require("socket.io");
var sockets = io.listen(8000);
var currentlyServing=0;
sockets.on("connection", function (socket)
{
console.log("client connected");
socket.emit("receive", currentlyServing);
socket.on("update", function(serving)
{
currentlyServing=serving;
if(currentlyServing>100)
currentlyServing=0;
if(currentlyServing<0)
currentlyServing=99;
socket.broadcast.emit("receive", currentlyServing);
console.log("update received: "+currentlyServing);
});
});
console.log("Server Started");
Вот соответствующая (надеюсь) выдержка с клиентской стороны:
var socket = io.connect("http://www.sampledomain.com:8000");
//function to update the page when a new update is received
socket.on("receive", function(receivedServing)
{
document.getElementById('msgs').value=""+String("00" + receivedServing).slice(-2);
document.getElementById('nowServing').value=receivedServing;
});
//this is called in an onClick event in the HTML source
//sends the new number to all other stations except this one (handled by server side)
function nextServing()
{
var sendServing = parseInt(document.getElementById('nowServing').value)+1;
socket.emit("update", sendServing);
document.getElementById('nowServing').value=sendServing;
document.getElementById('msgs').value=""+String("00" + sendServing).slice(-2);
}
Хорошо, вот здесь моя проблема. Это работает абсолютно нормально в каждой системе, которую я вложил, плавно и красиво - за исключением IE8. Если оставить в покое более 2-3 минут (без каких-либо действий), я получаю сообщение об ошибке "переполнение стека". Номер строки, на которой он появляется, колеблется (еще не определил задействованные факторы), но это всегда происходит на этом интервале. На некоторых рабочих станциях это занимает больше времени, и я начинаю думать, что он имеет прямую корреляцию с количеством оперативной памяти, имеющейся у компьютера, или, по крайней мере, на то, сколько выделяется веб-браузеру.
Я нашел онлайн-функцию, чтобы определить "максимальный размер стека", который, как я понимаю, не является точной наукой, однако я постоянно получал номер в области 3000. На моей машине IE11 со значительно большим количеством ресурсов я нашел ее чтобы быть в районе 20 000 человек. Это может быть не актуально, но я понял, что больше информации лучше:)
Чтобы избежать этой проблемы на данный момент, так что конечные пользователи не видят это сообщение об ошибке, я беру всего клиента script и помещаю его в iFrame, который перезагружается каждые 60 секунд, по существу, перезагружая стек, который так грязно сидит так близко к сетевой розетке, но купил мне время для публикации здесь. Я googled, пока я больше не могу google, но когда вы просматриваете "node.js" или "socket.io" вместе с "переполнением стека" в google, вы просто получаете много сообщений об этих двух темах которые размещены на веб-сайте stackoverflow dot com. ARG lol
Кто-нибудь?
ИЗМЕНИТЬ 18 НОЯБРЯ 2014 ГОДА КАК КОММЕНТАРИИ НИЖЕ:
сообщение об ошибке чаще всего запрашивает переполнение стека в строке 1056. IE Средства разработчика указывают на файл socket.io.js. Строка 1056:
return fn.apply(obj, args.concat(slice.call(arguments)));
который находится в этом разделе файла:
var slice = [].slice;
/**
* Bind `obj` to `fn`.
*
* @param {Object} obj
* @param {Function|String} fn or string
* @return {Function}
* @api public
*/
module.exports = function(obj, fn){
if ('string' == typeof fn) fn = obj[fn];
if ('function' != typeof fn) throw new Error('bind() requires a function');
var args = slice.call(arguments, 2);
return function(){
return fn.apply(obj, args.concat(slice.call(arguments)));
}
};