๐Ÿงญ KAIST JUNGLE/HandTris

[HandTris] #3. TypeError: Cannot read properties of undefined - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

seungineer = seungwoo + engineer 2024. 6. 24. 12:02

2024.06.21 - [๐Ÿงญ KAIST JUNGLE/HandTris] - [HandTris] #2. ํ”„๋กœํ† ํƒ€์ž… ํ†ต์‹  ํ…Œ์ŠคํŠธ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

 

[HandTris] #2. ํ”„๋กœํ† ํƒ€์ž… ํ†ต์‹  ํ…Œ์ŠคํŠธ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

2024.06.20 - [SEUNGWOO + ENGINEER] - [HandTris] #1. ๋ชจ๋ธ ์„ ์ • ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ) [HandTris] #1. ๋ชจ๋ธ ์„ ์ • ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ

seungineer.tistory.com

socket์˜ url์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.

soccket ๋ณ€์ˆ˜์— ๋‹ด๊ฒจ ์žˆ๋Š” url ์†์„ฑ์„ ๊ฐ€์ ธ์™€ sessionId๋ฅผ parsing ํ•˜๊ณ ์ž ํ•˜๋˜ ์ค‘ ๋งŒ๋‚ฌ๋˜ ์—๋Ÿฌ ์ค‘ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ œ๋ชฉ์€ 'TypeError'๋ผ๊ณ  ๋˜์–ด ์žˆ์ง€๋งŒ type์˜ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๊ณ , ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ฝ๋Š” ๋กœ์ง์ด ์œ„์น˜๋˜์–ด ์žˆ์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ์ „์—๋Š” ์ด ๋กœ์ง์„ ๋„˜์–ด๊ฐ€๋„๋ก ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ› ๋ฒ„๊ทธ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ ๊ฐ€์„ค

1. _transport ์†์„ฑ์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‚˜?

์ฒ˜์Œ ์ด ์—๋Ÿฌ๋ฅผ ๋ดค์„ ๋•Œ, stompClient ๊ฐ์ฒด๋Š” ๋‹น์—ฐํžˆ ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— '_transport'๋ผ๋Š” ์†์„ฑ๋ช… ์•ž์— ์–ธ๋”๋ฐ”๊ฐ€ ๋ถ™์–ด ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ธ์ง€ ์˜์‹ฌํ•˜์˜€๋‹ค. Typescript๋กœ ํ…Œ์ŠคํŠธํ•ด ๋ณธ ๊ฒฐ๊ณผ ๋‹น์—ฐํžˆ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ด ๊ฐ€์„ค์€ ๊ธฐ๊ฐ๋˜์—ˆ๋‹ค.

 

2. undefiend๋Š” ์–ด๋–ค ์ƒํ™ฉ์— ๋ฐœ์ƒํ•˜๋Š”๊ฐ€

์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์˜ ์†์„ฑ์„ ์ฝ์œผ๋ฉฐ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ์ •์˜๋˜์ง€ ์•Š๋Š”์ง€ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ์œ„ ์ƒํ™ฉ์˜ ๊ฒฝ์šฐ 'stompClient'๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, 'stompClient.ws'์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, 'stompClient.ws._transport'๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.

let socket = new SockJS('https://example.com/ws');
let stompClient = Stomp.over(socket);

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด stompClient๋Š” Stomp.over(socket);์— ์˜ํ•ด ์ดˆ๊ธฐํ™”๋˜๋Š”๋ฐ ์ด ๊ณผ์ •์„ ์‹คํŒจํ–ˆ์„ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด SockJS(URL); ํ•จ์ˆ˜๋กœ WebSocket ์—ฐ๊ฒฐ์„ ์‹คํŒจํ•˜๋ฉด socket์ด 'undefiend'๋  ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด undefiend๋ฅผ ์ด์šฉํ•ด Stomp.over()๋ฅผ ํ•˜๋ฉด ๋‹น์—ฐํžˆ stompClient๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค!

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ stompClient ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค์ด ์„ ์–ธ๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ๋กœ์ง์ด ์‹คํ–‰๋˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.

ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ํ™”๋ฉด์— ์ด์ƒํ•˜๊ฒŒ(?) ๋ธ”๋Ÿญ์ด ์ƒ์„ฑ๋œ๋‹ค.

์ด ์—๋Ÿฌ๋Š” ์•ž์„œ ๋งŒ๋‚ฌ๋˜ ์—๋Ÿฌ์™€ ์œ ์‚ฌํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์ด์ง€๋งŒ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ž๋‹ค. Cannot set properties of undefined ๋ฉ”์‹œ์ง€๋กœ ๊ฐ์ฒด๊ฐ€ undefined์ผ ๋•Œ ์†์„ฑ์„ set ํ•˜๊ณ ์ž ํ•ด์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜€๋‹ค. ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚œ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. ๋ธ”๋Ÿญ์ด (n, n) ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๋Œ€์นญ์œผ๋กœ ๊ณ ์ •๋œ๋‹ค.....๐Ÿค”

์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋ธ”๋Ÿญ์ด ํ…ŒํŠธ๋ฆฌ์Šค ๋ธ”๋Ÿญ ํ™”๋ฉด์„ ๋‚ด๋ ค์˜ค๋ฉด์„œ ํŠน์ • ์‹œ์ ์— (n, n) ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๋Œ€์นญ๋˜์–ด ์ €์žฅ๋œ๋‹ค. ์ดํ›„ ๋‹ค์Œ ๋ธ”๋Ÿญ์ด ๋‚ด๋ ค์˜ค๊ณ  ๋‹ค์Œ ๋ธ”๋Ÿญ์ด fix ๋˜๋ฉด ๋˜ (n, n) ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๋Œ€์นญ๋˜์–ด ์ €์žฅ๋œ๋‹ค. ์ด๋Š” ํœด๋จผ์—๋Ÿฌ๋กœ ๋ฐœ์ƒํ–ˆ๋‹ค. ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    Piece.prototype.fill = function (this: any, color: string) {
      for (let r = 0; r < this.activeTetromino.length; r++) {
        for (let c = 0; c < this.activeTetromino[r].length; c++) {
          if (this.activeTetromino[r][c]) {
            drawSquare(this.x + c, this.y + r, color);
            board[this.x + c][this.y + r] = color;
          }
        }
      }
    }

board ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ๋ณธ "grey" color, 20X10 size๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฐ’์ด๋‹ค. ์—ฌ๊ธฐ์„œ 'this.x+c, this.y+r'์ด ๊ฐ๊ฐ ์—ด๊ณผ ํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ํ–‰๊ณผ ์—ด์— ์œ„์น˜์‹œ์ผœ์„œ ์œ„์™€ ๊ฐ™์ด ๋Œ€์นญ๋˜์–ด ์ €์žฅ๋˜๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋ฐ”๋กœ ์œ„์˜ drawSquare() ํ•จ์ˆ˜ Parameter ์ˆœ์„œ๊ฐ€ x๋ถ€ํ„ฐ ๋˜์–ด ์žˆ์–ด ์ฐฉ๊ฐํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค๐Ÿซฃ.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๋‚˜?!

2. undefined์— setํ•  ์ˆ˜ ์—†๋‹ค!

 

๋ถ„๋ช… board๋Š” ์žˆ๋Š”๋ฐ undefined๋ผ๊ณ  ํ•˜๋ฉฐ, setting ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค. ์ง€๊ธˆ์€ ๋””๋ฒ„๊น… ํ›„๋ผ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋Š๊ปด์ง€๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋‹น์‹œ์—๋Š” ์ด ์—๋Ÿฌ๋กœ ๋™๋™ ์•“์•˜๋‹ค.. ๊ฒฐ๋ก ์ ์œผ๋กœ 'this.y + r'์˜ ๊ฐ’์ด ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์„œ board์˜ ์ธ๋ฑ์Šค์— ์Œ์ˆ˜๋กœ ์ ‘๊ทผํ•˜์—ฌ undefined ๋˜๊ณ , undefined์˜ 'this.x + c' ์ธ๋ฑ์Šค์— ์„ธํŒ…ํ•˜๊ณ ์ž ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

์œ„ Piece ๊ฐ์ฒด์˜ 'this.y'๋Š” ์ดˆ๊ธฐ -2๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, this.y+r์ด ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ๊ฐ€ ํ•„ํžˆ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค! ์Œ์ˆ˜์ผ ๋•Œ๋Š” ์•„๋ž˜ ๋กœ์ง์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜๋Š” ์—†์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด board๋ณ€์ˆ˜๊ฐ€ collision์„ checkํ•˜๋Š” ๋กœ์ง๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์–ด, ๋ธ”๋Ÿญ์ด ๊ฝ‰ ์ฐจ์„œ collision์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ์„ board ๋ณ€์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ฒ„๋ฆฌ๋ฉด board ๋ณ€์ˆ˜๋Š” ๋ธ”๋Ÿญ์ด ๊ฝ‰ ์ฐจ๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค์ง€ ๋ชปํ•œ๋‹ค!

3. ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์˜ ์ƒ์„ฑ

drawSquare() ํ•จ์ˆ˜์—์„œ canvas์˜ block์„ coloringํ•ด์คŒ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  board ๋ณ€์ˆ˜๋ฅผ ์ง€์† ์—…๋ฐ์ดํŠธํ•˜๊ณ ์ž ํ–ˆ๋˜ ์˜๋„๋Š” ์ด board ๊ฐ์ฒด๋ฅผ STOMP๋กœ ์ƒ๋Œ€๋ฐฉ ๊ฒŒ์ž„ํ™”๋ฉด์— ์ „์†กํ•˜๊ณ ์ž ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„์™€ ๊ฐ™์ด board ๋ณ€์ˆ˜๋ฅผ ์ „์†กํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋–จ์–ด์ง€๋Š” ๋ธ”๋Ÿญ์„ ์ „์†กํ•  ์ˆ˜ ์—†๊ณ , ๋ธ”๋Ÿญ์ด ๊ณ ์ •๋œ ํ›„์—์•ผ board ๋ณ€์ˆ˜๊ฐ€  ์—…๋ฐ์ดํŠธ๋˜์–ด ์ƒ๋Œ€๋ฐฉ ํ™”๋ฉด์— ํ‘œ์‹œ๋œ๋‹ค.

๊ฒฐ๊ตญ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜(board_forsend)๋ฅผ ๋งŒ๋“ค์–ด 'undefined๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฐ ๋ธ”๋Ÿญ์ด ๋–จ์–ด์งˆ ๋•Œ๋งˆ๋‹ค ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ'๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ขŒ์ธก์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด board_forsend๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ฆ์œผ๋กœ์จ ์šฐ์ธก ์ฝ”๋“œ์ฒ˜๋Ÿผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. undefined์— setting ํ•˜๋Š” ๋ฌธ์ œ์™€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์Š›~ ๊ณจ~(์™•๋ฟŒ๋“ฏ), slack

์ฝ”๋“œ๋Š” ์ œ ์—ญํ• ์— ์ถฉ์‹คํ•˜๋‹ค.
์—๋Ÿฌ๋Š” ์‚ฌ๋žŒ์ด ๋งŒ๋“œ๋Š” ๊ฒƒ.
๐Ÿ˜‚

2024.06.30 - [๐Ÿงญ KAIST JUNGLE/HandTris] - [HandTris] #4. ์›น์บ  ํ™”๋ฉด์„ ๊ฐ€๋ ค ๋ณด์ž - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

 

[HandTris] #4. ์›น์บ  ํ™”๋ฉด์„ ๊ฐ€๋ ค ๋ณด์ž - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

2024.06.24 - [๐Ÿงญ KAIST JUNGLE/HandTris] - [HandTris] #3. TypeError: Cannot read properties of undefined - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ) [HandTris] #3. TypeError: Cannot read properties of undefined - (์† ๋™์ž‘

seungineer.tistory.com