2014-12-09 21 views
5

मेरे नोड एप्लिकेशन के लिए, मेरे पास एक क्लाइंट (app.js) है जो मेरे क्लाइंट (index.html) में socket.io का उपयोग करके HTML और websocket डेटा दोनों की सेवा करने वाले डेबियन पर चल रहा है। । मैं एक बारी आधारित एचटीएमएल 5 मल्टीप्लेयर गेम बनाने का प्रयास कर रहा हूं।Node.js + Socket.io अधिकतम कॉल स्टैक आकार

socket.emit का उपयोग कर सफल डेटा प्रसारण के एक नंबर प्रदर्शन करने के बाद()/io.emit() और socket.on(), एक socket.emit पर अपने सर्वर क्रैश हो जाता है() त्रुटि
"की घटनाओं के साथ कहते हैं। जेएस: 72
फेंक एर; // अनचाहे 'त्रुटि' घटना
रेंज त्रुटि: अधिकतम कॉल स्टैक आकार पार हो गया "।
मेरे पास कुछ सॉकेट.ऑन() इवेंट श्रोताओं हैं, प्रत्येक गेम में एक अलग फ़ंक्शन को संभालने के साथ (जैसे roll_dice, end_turn, ready_to_play, आदि)।

मैंने समस्या का शोध करने का प्रयास किया (एसिंक लूप पर बहुत सी चर्चा मिली), लेकिन यह पता लगाने में असमर्थ था कि मेरे कोड के समाधान कैसे लागू करें। मैंने यहां प्रासंगिक स्रोत संलग्न किया है। तुम भी पर मेरी GitHub पर सभी स्रोत देख सकते हैं: https://github.com/sjmoon0/gameofdeath

index.html

var socket = io.connect('http://131.178.15.173',{'forceNew':true}); 
 
    
 
        ... 
 

 
    //----------------Initialization and Menu functions----------- 
 
    socket.on('load', function (data) { 
 
    console.log(data); 
 
    clientID=data; 
 
    socket.emit('check_game_started', { un: clientID }); 
 
    socket.on('last_client_loaded', function(hasStarted){ 
 
    \t console.log("Has game started? :"+hasStarted); 
 
    \t if(hasStarted==true){ 
 
    \t \t $('#choosecharacter').show(); 
 
    \t } 
 
    }); 
 
    }); 
 

 
    socket.on('client_disconnect', function (data) { 
 
    console.log(data); 
 
    }); 
 

 
    socket.on('client_counter', function (data) { 
 
    if(data<5){ 
 
\t  console.log(data); 
 
\t  incrementLoadBar(data); \t 
 
    \t allowedInGame=true; 
 
    } 
 
    if(!allowedInGame){ 
 
    \t ... 
 
    } 
 
    }); 
 

 
    socket.on('game_started', function (data) { 
 
    console.log(data); 
 
    $('#welcome').hide(); 
 
    $('#choosecharacter').show(); 
 
    }); 
 

 
    socket.on('set_user', function(characterName){ 
 
    \t chosenCharacter=characterName; 
 
    }); 
 

 
    socket.on('disable_player_choice', function(data){ 
 
    \t var id=data.stuff[0].chara; 
 
    \t incrementLoadBar(data.stuff[0].numChar); 
 
    \t console.log(id +" was chosen"); 
 
    \t $('#'+id).hide(); 
 
    }); 
 

 

 
//-------------------Gameplay functions 
 
    socket.on('start_gameplay',function(nonsense){ 
 
    \t showChanges(nonsense); 
 
\t $('#wait').hide(); 
 
\t $('#gamespace').show(); 
 
\t draw_c(); 
 
\t socket.emit('ready_to_play',chosenCharacter); 
 
    }); 
 

 
    socket.on('take_turn',function(updatedBoard){ 
 
    \t showChanges(updatedBoard); 
 
    \t if(updatedBoard.currPlayer==chosenCharacter){ 
 
    \t \t promptUser(updatedBoard); 
 
    \t } 
 
    }); 
 

 
    socket.on('roll_result',function(rollResult){ 
 
    \t promptUser(rollResult); 
 
    }); 
 

 
        ... 
 
        
 

 
\t $('#rollDiceButton').click(function(){ 
 
\t \t socket.emit('roll_dice',chosenCharacter); 
 
\t }); 
 

 
\t $('#okCloseButton').click(function(){ 
 
\t \t socket.emit('end_turn',chosenCharacter); 
 
\t }); 
 

 
\t $('.thumbnail').click(function(something){ 
 
\t \t socket.emit('player_chosen', something.target.id); 
 
\t \t    ... 
 
\t });

app.js

var app = require('http').createServer(handler) 
 
var io = require('socket.io')(app); 
 
var fs = require('fs'); 
 
var url = require('url'); 
 

 
... 
 

 
app.listen(8001); 
 

 
function handler (req, res) { 
 
... 
 
} 
 
console.log("~Server Running~"); 
 

 

 
io.on('connection', function (socket) { 
 
    console.log("A Client connected"); 
 
    ... 
 
    socket.emit('load', { user: uID }); 
 
    io.emit('client_counter',numClients); 
 

 
    if(numClients==4){ 
 
     gameStarted=true; 
 
     console.log("Game started!"); 
 
     io.emit('game_started',"The Game has begun!"); 
 
    } 
 
    else if(numClients>4){ 
 
     numClients--; 
 
     delete allClients[allClients.indexOf(socket)]; 
 
    } 
 

 
    socket.on('check_game_started', function (data) { 
 
    socket.emit('last_client_loaded', gameStarted); 
 
    console.log(data); 
 
    if(gameStarted){ 
 
     console.log("Last Player Loaded!"); 
 
    } 
 
    }); 
 

 
    socket.on('player_chosen', function(cp){ 
 
    ... 
 
    socket.emit('set_user', cp); 
 
    ... 
 
    io.emit('disable_player_choice',{'stuff':[{'chara':cp,'numChar':numCharChosen}]}); 
 
    if(numCharChosen==4){ 
 
     io.emit('start_gameplay', boardUpdate); 
 
    } 
 
    }); 
 

 
    socket.on('disconnect',function(){ 
 
    console.log("A client disconnected"); 
 
    numClients--; 
 
    delete allClients[allClients.indexOf(socket)]; 
 
    io.emit('client_disconnect',"We've lost another comrade!"); 
 
    }); 
 

 
    socket.on('ready_to_play',function(characterThatIsReadyToPlay){ 
 
    io.emit('take_turn',boardUpdate); 
 
    }); 
 

 
    socket.on('roll_dice', function(characterThatRolledDice){ 
 
    var temp=generateRollResult(characterThatRolledDice) 
 
    socket.emit('roll_result',temp); 
 
    }); 
 

 
    socket.on('end_turn',function(characterThatEndedTurn){ 
 
    io.emit('take_turn',nextUpdate(characterThatEndedTurn)); 
 
    }); 
 
});

कृपया कोमल हो, मैंने अभी एक सप्ताह के बारे में Node.js का उपयोग करना शुरू कर दिया पहले। धन्यवाद!

+0

क्या आप पूर्ण त्रुटि संदेश पोस्ट कर सकते हैं? – nha

+0

इसे शामिल करने के लिए संपादित प्रश्न, यह है: "events.js: 72 फेंक एर; // अनचाहे 'त्रुटि' घटना रेंज त्रुटि: अधिकतम कॉल स्टैक आकार पार हो गया"। – noden00b

उत्तर

27

मेरी समस्या मिली।

ऑब्जेक्ट (temp) मैं नेटवर्क पर भेजने की कोशिश कर रहा था (socket.emit ('roll_result', temp) में;) एक आत्म-संदर्भकारी सरणी थी। यह सरणी की रिकर्सिव प्रॉपर्टी थी जिसने स्टैक को अधिकतम आकार से अधिक कर दिया था।

+0

इस मुद्दे का कारण जोड़ने के लिए धन्यवाद, बस एक ही समस्या में भाग गया जो एक सॉकेट पर स्वयं रिकर्सिव ऑब्जेक्ट भेजने की कोशिश कर रहा था।आईओ कनेक्शन और पता नहीं था कि अधिकतम कॉल स्टैक आकार को पार करने के कारण क्या हो रहा था! –

+0

बहुत बहुत धन्यवाद! – patotoma

4

उत्तर बहुत उपयोगी है। धन्यवाद।

मुझे बस एक ही समस्या थी और इसे सामना करने वाले किसी भी व्यक्ति के साथ साझा करना चाहते हैं।

मेरे कोड express.js उपयोग करता है और निम्नलिखित है:

io = require('socket.io').listen(server); 
...... 
io.to(socketId).emit('hello', {userId:userId, data:data, res:res}); 

यह "अधिकतम कॉल स्टैक को पार कर" त्रुटि उत्पन्न। समस्या यह है कि मुझे क्लाइंट को सॉकेटियो पर परिवर्तनीय 'res' नहीं भेजना चाहिए। मुझे लगता है कि अगर ऐसा होता है तो यह कुछ पुनरावर्ती व्यवहार का कारण बन जाएगा।

समाधान सिर्फ फेंकना बयान से 'रेस' को दूर किया जाता है:

io.to(socketId).emit('hello', {userId:userId, data:data}); 
+0

इससे मेरी मदद की, सही जवाब होना चाहिए! –

0

यह वही त्रुटि मैं भर में आया था, जब मैं पर क्लिक किया सबमिट बटन है। यह अक्षम हो रहा था और "अधिकतम कॉल स्टैक आकार पार हो गया" फेंक रहा था। मैंने अपने ब्राउज़र को पुनरारंभ किया, यह काम किया .. अजीब व्यवहार

संबंधित मुद्दे