fs/promises를 이용한 JSON 데이터 로드 문제 해결
🔧 문제: JSON 데이터가 정상적으로 로드되지 않음
오늘은 게임 서버에서 JSON 형식으로 저장된 업적 데이터를 fs.readFile로 불러오고 achievements에 할당하려 했으나, 값이 제대로 반영되지 않는 문제가 있었다.
❗ 주요 증상
- Load() 함수 내부에서 JSON 파일은 정상적으로 읽힘.
- 그러나 외부에 선언된 achievements 변수에 데이터를 할당해도 반영되지 않음.
- console.log() 출력은 "데이터로드중..."까지만 되고, "데이터 로드 성공"은 출력되지 않음.
🔍 원인 분석
- fs.readFile()을 await로 쓰려면 fs/promises를 사용해야 하는데, 일반 fs 모듈을 사용하고 있어서 콜백 기반 함수로 인식됨.
- await fs.readFile(..., 'utf-8') 사용 시, utf-8이 콜백 함수 자리에 들어가면서 "The 'cb' argument must be of type function" 에러 발생.
import fs from 'fs'; // 문제 원인
- writeFileSync()를 사용하려 했는데, fs.promises에서 writeFileSync는 제공되지 않아 TypeError 발생.
fs.writeFileSync() // 동기 방식이며, 콜백이나 Promise를 지원하지 않음
✅ 해결 방법
- fs/promises를 import 하는 방식으로 통일:
import { promises as fs } from 'fs';
- 동기 방식이 필요할 경우에는 fs.writeFileSync를 fs에서 따로 불러와야 함:
import fs from 'fs';
import { promises as fsp } from 'fs';
- JSON 데이터를 loadData = JSON.parse(data)로 파싱한 후, Object.assign(target, loadData)로 기존 객체에 안전하게 병합.
💡 배운 점
- fs.readFile()과 fs/promises.readFile()은 완전히 다르게 동작하며, await를 사용하려면 반드시 fs/promises를 사용해야 한다.
- import 문에서 모듈을 혼용할 때는 함수 동기/비동기 여부에 따라 import 방식이 달라진다.
- JSON 파싱 결과를 Object.assign()으로 기존 객체에 덮어쓰는 방식은 객체 참조를 유지하며 안전하게 데이터를 갱신할 수 있다.
'이노베이션캠프 > TIL' 카테고리의 다른 글
이노베이션 캠프 8일차_과제 전투시스템 개선 (0) | 2025.07.15 |
---|---|
이노베이션 캠프 7일차_서버 문이 안 열려요?! (0) | 2025.07.14 |
이노베이션 캠프 5일차_무한 루프 로비 화면 (0) | 2025.07.11 |
이노베이션 캠프 4일차_MongoDB, 미들웨어, Joi, Prettier (1) | 2025.07.10 |
이노베이션 캠프 3일차_Node.js 기초 개념 정리 (3) | 2025.07.09 |