enum protobuf 사용 예시

이상현·2024년 11월 20일

[ TIL ]

목록 보기
34/38

protobuf를 불러와서 값을 사용하려고 할 때,

export const loadProtos = async () => {
  try {
    const root = new protobuf.Root();

    await Promise.all(protoFiles.map((file) => root.load(file)));

    // packetNames에 미리 정리한 패킷들을 가져와 매핑
    for (const [namespace, types] of Object.entries(packetNames)) {
      protoMessages[namespace] = {};
      for (const [type, typeName] of Object.entries(types)) {
        protoMessages[namespace][type] = root.lookup(typeName);
      }
      //root.lookupEnum
    }

    console.log('protobuf 파일 로드 완료.');
  } catch (e) {
    console.error(`protobuf 파일 로드 중 오류가 발생했습니다. ${e}`);
  }
};

loadProtos 함수를 통해 protobuf 파일들을 다 불러온 후,

enum GlobalFailCode {
    NONE_FAILCODE = 0; 
    UNKNOWN_ERROR = 1; 
    INVALID_REQUEST = 2; 
    AUTHENTICATION_FAILED = 3; 
    CREATE_ROOM_FAILED = 4;
    JOIN_ROOM_FAILED = 5;
    LEAVE_ROOM_FAILED = 6;
    REGISTER_FAILED = 7;
    ROOM_NOT_FOUND = 8;
    CHARACTER_NOT_FOUND = 9;
    CHARACTER_STATE_ERROR = 10;
    CHARACTER_NO_CARD = 11;
    INVALID_ROOM_STATE = 12;
    NOT_ROOM_OWNER = 13;
    ALREADY_USED_BBANG = 14;
    INVALID_PHASE = 15;
    CHARACTER_CONTAINED = 16;
}

enum GlobalFailCode를 불러와 클라이언트에게 패킷을 보낼 때 사용하였는데,

failCode : protoMessages.enum.GlobalFailCode.AUTHENTICATION_FAILED 

failCode의 값이 undefined로 뜨는 문제가 발생했다!

그래서 찍어본 console.log(protoMessages.enum.GlobalFailCode)에서

GlobalFailCode 안에 values로 값이 감싸져 있는 것을 발견했다!

그리하여

export const getFailCode = () => {
  const protoMessages = getProtoMessages();
  return protoMessages.enum.GlobalFailCode.values;
};

getFailCode() 함수를 만들어 GlobalFailCode.values에 있는 값들을 가져오도록 작성해 주었고 그렇게 완성된 코드의 형태는

const failCode = getFailCode();
failCode: failCode.JOIN_ROOM_FAILED

이러한 형태로 반들어주니 잘 작동하는 것을 확인해 주었다!

message와 다르게 enum으로 선언된 protobuf 값은 직접 들고 올 수 없다!

profile
Node.js_6기

0개의 댓글