코딩기록

항해 79일)오늘의 할 일 + TIL 본문

항해99/TIL

항해 79일)오늘의 할 일 + TIL

뽀짝코딩 2022. 3. 29. 14:01
728x90

 

 

 

 

 

 

오늘의 할 일

1. [결과창] 게임중간에 기권패 포인트 추가하기

 byebye소켓 → gameFinish_API → gameFInishSow_API 에서  byebye소켓 → thisGameOut_API 로 변경을 요청했었는데 알겠다 하고 

gameFinish와 동일하게 req를 보낸다 해서 다시 확인해 보니 기존 gameFinish 에서 thisGameOut으로 바뀌는 거였다. 나는 thisGameOut에서 결과창으로 보여지는걸 요청했었는데 내 요청과 전혀 다른걸 얘기해서 다시 생각해보니 이렇게 바뀌어도 되겠다 싶어 동의하고 

기권패는   byebye소켓 → thisGameOut_API  → gameFInishSow_API 이렇게 흐름이 진행된다.

 

기권패는   byebye소켓 → thisGameOut_API(gameFinishShow와 동일한 req,res)로 가는게 제일 좋은데 다시 얘기해서 아예 기권패부분을 하지 않고 기존 결과창과 같은 포인트 계산으로 넘어가되 옵저버가 얻는 포인트의 최대, 최소 포인트만 300으로 변경하기로 했다. 

 

 

 

2. CastError: Cast to Number failed for value "NaN" (type number) at path "observerCnt" 에러 확인하기

 -----에러내용---

Request URL: /lobby  -  2022-03-29 13:50:55
0|server  | CastError: Cast to Number failed for value "NaN" (type number) at path "observerCnt"
0|server  |     at model.Query.exec (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/query.js:4650:21)
0|server  |     at model.Query.Query.then (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/query.js:4749:15)
0|server  |     at runMicrotasks (<anonymous>)
0|server  |     at processTicksAndRejections (node:internal/process/task_queues:96:5) {
0|server  |   messageFormat: undefined,
0|server  |   stringValue: '"NaN"',
0|server  |   kind: 'Number',
0|server  |   value: NaN,
0|server  |   path: 'observerCnt',
0|server  |   reason: AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
0|server  |
0|server  |     assert.ok(!isNaN(val))
0|server  |
0|server  |       at castNumber (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/cast/number.js:27:10)
0|server  |       at SchemaNumber.cast (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/schema/number.js:380:12)
0|server  |       at SchemaNumber.SchemaType.applySetters (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/schematype.js:1179:12)
0|server  |       at SchemaNumber.SchemaType._castForQuery (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/schematype.js:1613:15)
0|server  |       at SchemaNumber.castForQuery (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/schema/number.js:434:14)
0|server  |       at SchemaNumber.SchemaType.castForQueryWrapper (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/schematype.js:1580:20)
0|server  |       at castUpdateVal (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/helpers/query/castUpdate.js:527:19)
0|server  |       at walkUpdatePath (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/helpers/query/castUpdate.js:344:24)
0|server  |       at castUpdate (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/helpers/query/castUpdate.js:96:7)
0|server  |       at model.Query._castUpdate (/home/ubuntu/Omok-BE/node_modules/mongoose/lib/query.js:4859:10) {
0|server  |     generatedMessage: true,
0|server  |     code: 'ERR_ASSERTION',
0|server  |     actual: false,
0|server  |     expected: true,
0|server  |     operator: '=='
0|server  |   },
0|server  |   valueType: 'number'
0|server  | }
0|server  | Request URL: /lobby  -  2022-03-29 13:51:00

 

 

 

3. gameStart-API response에 gameName추가로 보내기

완료

 

4. 게임방 소켓 connect시 유저 connect값을 'ingame'으로 변경, disconneting시 'offline'으로 변경하기

처음에는 겜방소켓 연결후니까 connection이벤트에서 하나보다 하고 작성했는데 겜시작후 유저디비 connect은 여전히 offline 이었다. 다시 생각해보니 updateOne 한다고 되는게 아니가 id를 받아야 할것 같았다. 프론트에 요청하지 않고 하려면 어떻게 하나 게임API에서 사용하는 gameUserInfo를 모듈로 빼서 여러파일에서 쓸수 있게 해야하나 그러면 gameNum으로 id들만 따로 찾아야 하는데 그게 또 참 복잡했다. 다시 생각해보니 gameStart이벤트에서 id만 추가로 받는 다면 쉽게 해결될 거 같았다 최대한 프론트 요청없이 나 혼자 하려고 했는데 안되서 그냥 id를 추가로 받았고 1분도 안되서 4시간 고민하던게 해결됐다.

 

5.  가끔씩  게임결과창 점수가 player, observer화면에 다르게 뜨는 오류가 발생한다.

원인 모름. 소켓과 관련된것 같다.

 

6. 기권패가 옵저버 계산수정하기

*1. 이겼을때는 옵저버의 쓴포인트, 얻은포인트, 기존포인트, 총포인트 다 맞는데  지면 옵저버 기존포인트는 +300이나-300후의 점수가 들어가고 총포인트가 현재디비포인트가 나온다.

 

*2. gameFinish API에서 옵저버를 찾는 방법을 바꿨다. gameUserInfo를 함수로 빼고 그 함수를 이용해 gameNum을 기준으로 찾고 거기서 찾음 옵저버를 for문으로 돌려 blackO.state === 'blackObserver'나 whiteO.state === 'whiteObserver'로 찾으니 오류 없이 기권패 옵저버 패 포인트 계산이 잘된다. 아까는 teachingCnt도 0으로 리셋이 안됐는데 전부 해결됐다.

함수나 모듈로 빼는걸 많이 연습해야 겠다.

 

 

* 3. 아까 찾은 for문 코드 오류를 해결하고 잘나올때가 있고 잘 안나올때가 있다.

아무래도 gameFinishShow에서 마지막에 online으로 state값을 변경해주는데 여기서 문제가 있는것 같다. 근데도 이상한게 gameFinish에서 req.body에 state로 변경된다 흠.. 잘 모르겠다. 내일 다시 해야지

 

 

 

 

 

오늘의 스케줄
  • 09:45 - 기상
  • 새벽6:20 - 수면

 

 

오늘 배운 것

매니저님과 상담했다. API설계때나 코드작성시 남보다 파악하는데 시간이 더 걸리는 부분에 대해 상담을 받았고 API를 이해하기위해 내가 하는 방법으로 그림을 그린다거나 req, res, 그 API가 하는 일, res로 보내주기위해 가공할때 어떤 문법이 필요한지 등을 글로 정리해서 작성한다고 답변 했고 나에게 QA sheet 라는걸 알려주셨다 품질보증 체크인데 개발자가 고민해야하는 예측케이스들을 기획자가 작성하는 것이다.

api코드 작성시 나만의 QA시트를 작성해서 버튼눌렀을때 어떤일이 일어나는지 에러처리는 어떻게 해야하는지 상세히 적어보고 코드를 작성하라는 조언이었다.

나에게 필요한 방법이다. 지금은 에러를 잡는 중이라 API설계를 할 일은 없지만 나중에 간단히라도 코드를 작성한다면 시도해 봐야겠다.

 

참고

https://yozm.wishket.com/magazine/detail/920/

 

 

 

반응형

'항해99 > TIL' 카테고리의 다른 글

항해 81일)오늘의 할 일 + TIL  (0) 2022.03.31
항해 80일)오늘의 할 일 + TIL  (0) 2022.03.30
항해 74일) 오늘의 할 일 + TIL  (0) 2022.03.24
항해 51일) 오늘의 할 일 + TIL  (0) 2022.03.01
항해 48일) 오늘의 할 일 +TIL  (0) 2022.02.26
Comments