728x90

보통 node 로 api 백엔드를 구성할때 env 파일을 설정 하고 db.config.js 로 db 설정 파일을 별도로 두고 관리한다. 개발서버에서는 잘 되다가 실서버로 이전 했는데 소스는 동일한데 response 에 데이터가 모두 이진법으로 buffer type 으로 넘어 올때가 있다. 숫자 데이터는 정상적으로 나오는데 영문이나 한글 등 string 형태의 데이터는 모두 이렇게 나와서 처음에는 무척 당황했다. 

 

"mem_id": { "type": "Buffer", "data": [116, 101, 115, 116, 49, 49, 49] }

 

캐릭서셋이 안맞을 경우 이런 현상이 발생하는데 이때는 캐릭터셋을 수정해 볼수 있으면 그 방법이 가장 좋지만 이미 데이터가 모두 들어가 있는 상태에서 기존 db 데이터도 문제가 없어야 하고 신규 데이터 연동에 대해서도 문제가 없어야 하는 상황이라면 typeCast 를 설정해서 데이터를 읽어 올때 utf8 로 toString 으로 변환해 주는 방법이 있다. 숫자는 정상적으로 나오지만 string 데이터가 문제 이기 때문에 조건문에는 VAR_STRING 와 BLOB 데이터를 걸러 준다. 캐릭터셋도 맞는 형식으로 한번 더 정의를 해준다. 

charset: 'utf8mb4'
const connInfo = {
	host: process.env.REACT_APP_DB_HOST,
	port: process.env.REACT_APP_DB_PORT,
	user: process.env.REACT_APP_DB_USER,
	password: process.env.REACT_APP_DB_PASSWORD,
	database: process.env.REACT_APP_DB_NAME,
	// ... 기타 연결 정보

	// typeCast 함수 추가
	typeCast: function(field, next) {
		// field 객체는 현재 처리 중인 필드의 메타데이터를 담고 있습니다.
		// 예를 들어 field.type, field.length 등을 확인할 수 있습니다.
		// next 함수는 기본 타입 변환 로직을 수행합니다.

		// 예시: BLOB 또는 VARCHAR 타입이 Buffer로 넘어올 때 문자열로 변환
		if (field.type === 'BLOB' || field.type === 'VAR_STRING') { // 또는 다른 문자열 관련 타입
			if (field.length === 0) { // 빈 문자열 처리
				return '';
			}
			// Buffer 타입인 경우 toString('utf8')로 변환
			if (field.buffer()) {
				return field.buffer().toString('utf8');
			}
		}

		// 다른 타입의 경우 기본 변환 로직 사용
		return next();
	}
};

 

728x90

+ Recent posts