๋๋ ๋จ์ง `รฌo.sockets.emit('hey', data); and it will crash with
RangeError: ์ต๋ ํธ์ถ ์คํ ํฌ๊ธฐ๊ฐ . I use it in other places in my app and it works fine. I am not repeating this (checked with console). The logs say the error is in
socket.io/node_modules/has-binary-data/index.js:46``๋ฅผ ์ด๊ณผํ์ต๋๋ค.
๋ฌธ์ ๊ฐ ์ด๋์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฌ์ฉํ๊ธฐ ์ง์ ์ io.sockets
๋ก๊น
์ ์๋ํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
{ name: '/',
17:39:37 web.1 | server:
17:39:37 web.1 | { nsps: { '/': [Circular] },
17:39:37 web.1 | _path: '/socket.io',
17:39:37 web.1 | _serveClient: true,
17:39:37 web.1 | _adapter: [Function: Adapter],
17:39:37 web.1 | _origins: '*:*',
17:39:37 web.1 | sockets: [Circular],
17:39:37 web.1 | eio:
17:39:37 web.1 | { clients: [Object],
17:39:37 web.1 | clientsCount: 2,
17:39:37 web.1 | pingTimeout: 60000,
17:39:37 web.1 | pingInterval: 25000,
17:39:37 web.1 | upgradeTimeout: 10000,
17:39:37 web.1 | maxHttpBufferSize: 100000000,
17:39:37 web.1 | transports: [Object],
17:39:37 web.1 | allowUpgrades: true,
17:39:37 web.1 | allowRequest: [Function],
17:39:37 web.1 | cookie: 'io',
17:39:37 web.1 | ws: [Object],
17:39:37 web.1 | _events: [Object] },
17:39:37 web.1 | engine:
17:39:37 web.1 | { clients: [Object],
17:39:37 web.1 | clientsCount: 2,
17:39:37 web.1 | pingTimeout: 60000,
17:39:37 web.1 | pingInterval: 25000,
17:39:37 web.1 | upgradeTimeout: 10000,
17:39:37 web.1 | maxHttpBufferSize: 100000000,
17:39:37 web.1 | transports: [Object],
17:39:37 web.1 | allowUpgrades: true,
17:39:37 web.1 | allowRequest: [Function],
17:39:37 web.1 | cookie: 'io',
17:39:37 web.1 | ws: [Object],
17:39:37 web.1 | _events: [Object] } },
17:39:37 web.1 | sockets:
17:39:37 web.1 | [ { nsp: [Circular],
17:39:37 web.1 | server: [Object],
17:39:37 web.1 | adapter: [Object],
17:39:37 web.1 | id: 'RfgXeMgHeP_9SQC5AAAC',
17:39:37 web.1 | client: [Object],
17:39:37 web.1 | conn: [Object],
17:39:37 web.1 | rooms: [Object],
17:39:37 web.1 | acks: {},
17:39:37 web.1 | connected: true,
17:39:37 web.1 | disconnected: false,
17:39:37 web.1 | handshake: [Object],
17:39:37 web.1 | _events: [Object] },
17:39:37 web.1 | { nsp: [Circular],
17:39:37 web.1 | server: [Object],
17:39:37 web.1 | adapter: [Object],
17:39:37 web.1 | id: '7TEjGJjWzxObulClAAAD',
17:39:37 web.1 | client: [Object],
17:39:37 web.1 | conn: [Object],
17:39:37 web.1 | rooms: [Object],
17:39:37 web.1 | acks: {},
17:39:37 web.1 | connected: true,
17:39:37 web.1 | disconnected: false,
17:39:37 web.1 | handshake: [Object],
17:39:37 web.1 | _events: [Object] } ],
17:39:37 web.1 | connected:
17:39:37 web.1 | { RfgXeMgHeP_9SQC5AAAC:
17:39:37 web.1 | { nsp: [Circular],
17:39:37 web.1 | server: [Object],
17:39:37 web.1 | adapter: [Object],
17:39:37 web.1 | id: 'RfgXeMgHeP_9SQC5AAAC',
17:39:37 web.1 | client: [Object],
17:39:37 web.1 | conn: [Object],
17:39:37 web.1 | rooms: [Object],
17:39:37 web.1 | acks: {},
17:39:37 web.1 | connected: true,
17:39:37 web.1 | disconnected: false,
17:39:37 web.1 | handshake: [Object],
17:39:37 web.1 | _events: [Object] },
17:39:37 web.1 | '7TEjGJjWzxObulClAAAD':
17:39:37 web.1 | { nsp: [Circular],
17:39:37 web.1 | server: [Object],
17:39:37 web.1 | adapter: [Object],
17:39:37 web.1 | id: '7TEjGJjWzxObulClAAAD',
17:39:37 web.1 | client: [Object],
17:39:37 web.1 | conn: [Object],
17:39:37 web.1 | rooms: [Object],
17:39:37 web.1 | acks: {},
17:39:37 web.1 | connected: true,
17:39:37 web.1 | disconnected: false,
17:39:37 web.1 | handshake: [Object],
17:39:37 web.1 | _events: [Object] } },
17:39:37 web.1 | fns: [],
17:39:37 web.1 | ids: 0,
17:39:37 web.1 | acks: {},
17:39:37 web.1 | adapter:
17:39:37 web.1 | { nsp: [Circular],
17:39:37 web.1 | rooms:
17:39:37 web.1 | { '5MGPNOdO4th_dOuZAAAA': [],
17:39:37 web.1 | '64rUhxxp--4Qk1MqAAAB': [],
17:39:37 web.1 | RfgXeMgHeP_9SQC5AAAC: [Object],
17:39:37 web.1 | '7TEjGJjWzxObulClAAAD': [Object] },
17:39:37 web.1 | sids:
17:39:37 web.1 | { RfgXeMgHeP_9SQC5AAAC: [Object],
17:39:37 web.1 | '7TEjGJjWzxObulClAAAD': [Object] },
17:39:37 web.1 | encoder: {} },
17:39:37 web.1 | _events: { connection: [Function] } }
๋ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
`````` ์๋ฐ์คํฌ๋ฆฝํธ
if (game.scoreTeamTwo > game.scoreTeamOne && game.scoreTeamTwo > game.scoreTeamThree && game.scoreTeamTwo > game.scoreTeamFour) {
game.winner = 2;
io.sockets.emit('CTFEnd', ๊ฒ์);
}
//ํ 1์ด ๊ฒ์์์ ์ด๊ธฐ๋ฉด CTFEnd
๋ฐ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์ถํ๋์ง ํ์ธํฉ๋๋ค.
``````
๋ด ๋ฌธ์ ์ ๋ํ "ํด๊ฒฐ์ฑ "์ ์ฐพ์์ต๋๋ค. ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ํฉ์ด์ ธ ๋ณด๋ผ ์ ์์ง๋ง ๊ฐ์ฒด์์๋ ์๋ํ์ง ์์ต๋๋ค.
๋๋ ์ต๊ทผ์ ๊ทธ ์ค๋ฅ๋ ์ป์์ต๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ๊ฐ๋์ฉ๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ์์นจ ๋ด๋ด ํ ์คํธํ๋๋ฐ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์์ต๋๋ค.
๋์๊ฒ ๊ทธ๊ฒ์ obj๊ฐ ๋๋ฌด ํด ๋๋ง ๋ชจ๋ ์ฌ๋์๊ฒ ๋ฐฉ์ถํ ์ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค.
@BenBals ๊ฐ์ฒด๊ฐ ๋๋ฌด ํฐ ๊ฒฝ์ฐ ์ ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฌธ์์ด ํํ๋ก ๋ณด๋ด๋ ๊ฒ์
๋๋ค. ์ฆ JSON.stringify()
์คํ
๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ณ ๋ คํ์ต๋๋ค.
:cry: ์ด๊ฒ์ ๋ํด ์กฐ์ฌ ์ค
์ ํ์ ๊ฐ์ฒด๋ฅผ ๋ด๋ณด๋ผ ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
{success: file, content: file.content} ์ฌ๊ธฐ์ file.content๋ Buffer ๊ฐ์ฒด์ด๊ณ ํ์ผ์ ๋ค๋ฅธ ๋ชจ๋ ์์ฑ์ ๋ฌธ์์ด์
๋๋ค.
hasBin()์ ๊ฐ์ฒด์ ์ฒซ ๋ฒ์งธ ์์ค๋ง ํ์ธํ๊ธฐ ๋๋ฌธ์ ํ๋ ๋ด์ฉ์ ๊ฐ์ฒด์ ์ง์ ์ถ๊ฐํด์ผ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฒํผ๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ ๋ '์ต๋ ํธ์ถ ์คํ ์ด๊ณผ'๊ฐ ๋ฐ์ํ์ต๋๋ค.
์์ผ ๊ฐ์ฒด๋ฅผ ๋ด๋ณด๋ด์ด ์ด๋ฅผ ๋ณต์ ํ ์ ์์ต๋๋ค(์ ์ด๋ ํ ๋ฐฉํฅ). (์๋๋ ์๋ฒ์์ -> ํด๋ผ์ด์ธํธ๋ก)
socket.emit('crash', {socket:socket});
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ค์ ์์ ์ฌํญ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํด๋น ๋ฌธ์ ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
ํธ์ง : ๋ด ๋ฌธ์ ๋ ์ฌ๊ท ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๋ค๋ ๊ฒ์
๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ Firebase ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ๋ฌํ๋ ค๊ณ ํ ๋ ์ด์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ค๋ฅ
node_modules/socket.io/node_modules/has-binary-data/index.js:46
for (var key in obj) {
^
RangeError: Maximum call stack size exceeded
์๋ฒ ์ธก
var DB = new Firebase('https://1234abcd.firebaseIO.com');
var USERS = DB.child("users");
io.sockets.on('connection', function(socket){
socket.emit('test', {
db: USERS
});
});
ํด๊ฒฐ์ฑ ์ ์ฐพ์ต๋๋ค...
๋ฏธ์ํ์ง๋ง ๋ด ์ค๊ตญ์ด๋ ๊ทธ๋ ๊ฒ ๋ฐ์ด๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ์์ด๋ก ๋ฒ์ญํ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ์น์ ํฉ๋๊น?
๊ตฌ๊ธ ๋ฒ์ญ์ ํ๋๋ "ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ผ..."๋ผ๊ณ ๋์ค๋ค์... ๋ณ๋ก ๋ตํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ socket.io๋ฅผ ํตํด ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ง ์๋ ๊ฒ์ ๋๋ค. ๋น ๋ฅด๊ณ ์งง์ ์๋ต์ ์ํด ์ค๊ณ๋ ์์ผ์ ๋๋ค. ์๋ต์ ๋๋๊ฑฐ๋ ajax๋ฅผ ํตํด ๋ณด๋ด์ญ์์ค. ์ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ์ทจ์ํฉ๋๋ค.
socket.io ์ฝ๋๊ฐ ํ ์ ์๋ ํ ๊ฐ์ง๋ ๋ค์ ๊ณผ ๊ฐ์ด ๊ฐ์ฒด์ ํด๋น ์์ฑ์ ๋น๋๊ธฐ์์ผ๋ก ๋ฐ๋ณตํ๋ ๊ฒ์
๋๋ค.
var props = [];
var obj = { a: 1, b:2, c: { d: 3, e: 4 } };
function next_prop(callback){
if (!props.length){
setTimeout(callback);
return;
}
var prop = props.shift();
//do whatever with the prop, call parse_obj on it if it's an object
setTimeout(next_prop);
}
function parse_obj(obj, callback){
for (var i in obj){
props.push(i);
}
setTimeout(function(){next_prop(callback);});
}
parse_obj(obj);
๋ฌผ๋ก ์ด๊ฒ์ ์ค์ ์ฌ์ฉํด์ผ ํ๋ ์ฝ๋๊ฐ ์๋๋๋ค. ์ค์ฒฉ๋ ๊ฒฝ์ฐ ๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ํ ํจ์๋ฅผ ๋ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ตฌ๋ฌธ ๋ถ์ ์ค์ธ ๊ฐ์ฒด์ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ ์ค๋ฅ๋ ๋ฐ์ํฉ๋๋ค. ๋ด ์ฝ๋๋ "io.sockets.emit('key', data);"์ ๊ฐ์ต๋๋ค.
๋๋ "๋ฐ์ดํฐ"๊ฐ์ฒด๋ฅผ ๋จ์ํํ๊ณ ์๊ฒ ์ ์งํ๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์๋ํ์ต๋๋ค.
--๊ทธ๋ฆฌ๊ณ , src ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ๋ค์์ ์ฐพ์์ต๋๋ค.
"๋ฐ์ดํฐ" ๊ฐ์ฒด์ ์ฌ๊ท ์์ฑ ์ฐธ์กฐ๊ฐ ์์ผ๋ฉด ์ด ์ฝ๋๊ฐ ์ถฉ๋ํฉ๋๋ค.
์: ํ๋กํ > ํ๋กํ > ํ๋กํ ...
+1 ์ด์ง ๊ฒ์ฌ์ ๋น๋๊ธฐ ๋ฒ์ ๊ณผ ๊ฐ์ ํต์ฌ ํ์ ํด๋น ์ค์ ์ ์ป๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์์ผ ๊ฐ์ฒด๋ฅผ ์ ์กํ์ฌ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค. :)
+1 IE11์ _hasBinary์ '์คํ ๊ณต๊ฐ ๋ถ์กฑ'์ ํ์ํฉ๋๋ค.
์ด ์ค๋ฅ๋ ์ ์ฒด ์์ผ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ค์ ๋ณด๋ด๋ ค๊ณ ํ ๋ ํ์๋์์ต๋๋ค. ๋ด๊ฐ _์ ๋ง๋ก_ ํ์ํ ๊ฒ์ socket.id
์์ผ๋ฏ๋ก ๋ ์์ ํญ๋ชฉ์ ๋ค์ ๋ณด๋์ ๋ ์ค๋ฅ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ ์ ์ฒด socket
๋์ socket.id
๋ฅผ ๋ณด๋์ต๋๋ค.
์ด๊ฒ์ ์คํ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ ์ฌ๊ท ํธ์ถ์ ์ด๋ํ๋ ์ํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ์ ์ ์์ต๋๋ค.
@LordMajestros ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด
@GerbenHofman ์ฒ๋ง ์์
NodeJS v4.4.4 ๋ฐ socket.io v1.4.5์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ์ฐ๊ฒฐ ํด์ ์ด๋ฒคํธ ํ์ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ socket.emit
20๋ง ๋ฒ ์ด์ ํธ์ถํ์ ๋๋ง ๋ฐ์ํฉ๋๋ค.
socket.emit
ํธ์ถ ํ์๊ฐ ์ฝ 100,000๊ฐ์ด๋ฉด ์ด ์ค๋ฅ๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
emit
์ ํจ๊ป ์ฌ์ฉํ๋ ๋งค๊ฐ๋ณ์๋ ํญ์ ๋ฌธ์์ด์
๋๋ค.
์ด ์ ๋ณด๊ฐ ๋์์ด ๋์๋์?
@shunjikonishi ์ ์ถ๊ฐํ๊ธฐ ์ํด ์ ํํ 100,000๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์๋ง์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋๋ 1 ๊ฐ์ ์๋ง์ด ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก 100,000์ ํ๋ ์บก์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ Node(๋๋ JavaScript ๋ฐํ์)์ ์ํด ๋ถ๊ณผ๋ ์ ํ์ธ ๊ฒ ๊ฐ์ผ๋ฉฐ Socket.io๋ ๋น์ ์ด ๋ฐฉ์ถ์ ํธ์ถํ ๋๋ง๋ค ๋ฌด์ธ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฏ๋ก 100,000๋ฒ์งธ ๋ฐฉ์ถ์ ๋๋ฌํ๋ฉด ๊ทธ๋ฅ ๋์ด์ง๋๋ค.
Node 5.11.0 ๋ฐ Socketio 1.4.8์์ ํ ์คํธ๋์์ต๋๋ค. ๋ด Node ๋ฒ์ ์ @shunjikonishi ์ ๋ค๋ฅด๋ฉฐ(๋ด ์ด์ ์ฒด์ ๋ฑ, ์ค์ ๋ก ์ด 100,000์ด ์ด๋์์ ์๋์ง ์ ํ ๋ชจ๋ฆ ๋๋ค) ์ด๊ฒ์ด ๋ด๊ฐ 100,000์์ ์ ํ์ ๋๋ฌํ ๋ฐ๋ฉด ๊ทธ๋ ์ต๋ 200,000์ ๋๋ฌํ ์ด์ ๋ฅผ ์ค๋ช ํ ์ ์์ต๋๋ค.
๋๋ ws.js๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๊ณ ์ ์๋ํ๊ณ ๋ฌธ์ ์์ด 100,000 ์์ผ ๋ฐฉ์ถ์ ์ด๊ณผํ์ต๋๋ค. ๊ทธ๋์ ์๋ง๋ Socket.io์ ๋ฌธ์ ์ผ ๊ฒ์ ๋๋ค.
์์ผ IO์์ ์ฌ๊ท ๋ฐ์ดํฐ๊ฐ ๋ฐฉ์ถ๋๊ณ ์ด ์ค๋ฅ๋ก ์ธํด ์คํจํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ณดํธ ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น? ๊ฐ๋จํ ๊ฐ์ง๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋์ "์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ ์ ์์ต๋๋ค"์ ๊ฐ์ ์๋ฏธ ์๋ ์ค๋ฅ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋๋ฒ๊น ์ด ๋ ์ฌ์์ง๋๋ค.
์ํ ๋ฐ์ดํฐ ๊ฐ์ง๋ฅผ ์ํ ๋ช ๊ฐ์ง ๊ด์ฐฎ์ ์๋ฃจ์ ์ด ์์ต๋๋ค. https://stackoverflow.com/questions/14962018/detecting-and-fixing-circular-references-in-javascript
ํ ๊ฐ์ง ๊ฐ๋จํ ์๋ฃจ์ ์ JSON.stringify๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค.
function isObjectCircular(obj) {
try {
JSON.stringify(circularReference);
} catch(err) {
return (err.toString() === 'TypeError: Converting circular structure to JSON');
}
return false;
}
์์ธํ ๋ด์ฉ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value
@adamreisnz PR ํ์ํฉ๋๋ค ;)
๋ด๊ฐ ๋๊ธ์ ๋ฌ๊ณ 5๊ฐ์ ํ์ ๋๊ตฐ๊ฐ๊ฐ ๋๋ฅผ ๋ฉ์ ํ๋ฉด ํญ์ ๋นํฉ์ค๋ฌ์์๐
์ด ์ค๋ฅ๋ ๋ง๋ฌ์ต๋๋ค. ๊ทธ๋์ ์ ์ฒด ์ฝ๋๋ฅผ ํ์ธํ๋ ๋ฐ 2์๊ฐ์ ๋ญ๋นํฉ๋๋ค.<.
A={B:{C:A}}์ ๊ฐ์ ์ฌ๊ท ๊ฐ์ฒด๋ก ์ธํด ๋ฐ์ํ๋ค๊ณ ์๊ฐํ๋ฉฐ ๋ถ๋ช
ํ ์์ผ ์ ์ฌ๊ท ๊ฐ์ฒด์
๋๋ค.
์ฌ์ค, buffer.js์์ ๊ทธ๋ค์ด ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๋ด๋ ค๋ ๋ฐ์ดํฐ์ ๊ธธ์ด๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์ ์ผ์ด๋ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ "์ต๋ ํธ์ถ ์คํ ํฌ๊ธฐ ์ด๊ณผ"๋ฅผ ์ป์ต๋๋ค. JSON.stringify()๋ฅผ ์ฌ์ฉํ์ฌ ๊ธธ์ด๋ฅผ ์ป์ผ๋ฉด "์ํ ๊ตฌ์กฐ"์ ๋ํ ๋ ๋ค๋ฅธ ๋ช
๋ฐฑํ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ทธ๊ฒ์ ๊ตฌ๊ธ์ ๋์ ํค์๋๊ฐ ์์ต๋๋ค!
๋๋ ๋ฐฉ๊ธ ์ด๊ฒ์ ๋ถ๋ช์ณค๋ค.
hasBin
๋ ์ํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๋ฉด ์ฌ๊ท ๋ฃจํ๋ก ์คํ์ ์ฑ์๋๋ค.
์ฟ, ๋๋ โโ์ด๊ฒ์ ๊ณ ์น 2๋ ๋์ ์ด๋ฆฐ PR์ด ์๋ค๋ ๊ฒ์ ์๋ค:
@dustingraham ์์ ์
๋ํ ๋ ์ด์ hasBinary
๋ฉ์๋๋ฅผ throwํ์ง ์๋๋ผ๋ ๋์ค์ ์ฝ๋์์ ํธ์ถ๋๋ JSON.stringify ๋ฉ์๋์์ ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์๊น ๊ฑฑ์ ๋ฉ๋๋ค.
> var a = {};
undefined
> var b = { a: a };
undefined
> a.b = b
{ a: { b: [Circular] } }
> JSON.stringify(a)
Thrown:
TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ์คํ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ ์ฌ๊ท ํธ์ถ์ ์ด๋ํ๋ ์ํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ์ ์ ์์ต๋๋ค.