1. 程式人生 > >使用Socket.io遇到錯誤RangeError: Maximum call stack size exceeded

使用Socket.io遇到錯誤RangeError: Maximum call stack size exceeded

RangeError: Maximum call stack size exceeded

錯誤原因

傳輸資料不要傳輸socket物件(JSON),socket是一個包含迴圈結構的JSON,會引起buffer.js的爆棧錯誤!

起因

我在伺服器對client emit事件傳輸資料的時候出現了這個錯誤,這個錯誤有一個非常糟糕的關鍵詞,最大棧呼叫(爆棧),這個關鍵詞嚴重阻礙了我在Google上尋找答案,後來我單步除錯,找到了出錯的原因,爆棧只是表象原因,根本原因在於buffer.js對傳送資料的處理 在這裡插入圖片描述

原因

其實原因很簡單,就是emit傳送的JSON資料中包含一個迴圈的結構(circular structure)。 什麼是迴圈的結構呢? 下面的A就包含一個迴圈的結構,使用JSON.stringify(A)的話會得到錯誤,表示無法把一個迴圈結構的JSON轉成字串 在這裡插入圖片描述

為什麼傳輸資料的迴圈結構會導致最大棧呼叫錯誤呢? 因為在buffer.js 為了得到傳輸資料(JSON)的內容、長度,它會遞迴遍歷你傳輸的資料,很顯然它沒有對迴圈結構的JSON做很好的處理,所以直接導致了爆棧錯誤; 反觀JSON.stringify()函式,遇到迴圈JSON會直接明瞭地報告迴圈結構錯誤,不會讓人產生誤會!