ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2019-10-10 개발일지
    개발일지 2019. 10. 10. 19:01

    게임 결과 조회 API를 작업해서 마무리했다.

     

    어려운 문제는 로우 쿼리에서 발생했는데, 아래와 같은 코드가 있었다.

     

    const query: string = `SELECT ~~~~ FROM ~~~~`;
    const replacements: object = {
        something: 'something'
    }; 
    
    const model = await Model.sequelize!.query(query, {
        replacements
    });
    
    model.forEach(row => {
        row.getDataValue(); // Error
    });

     

    query() 함수를 통해 조회를 실행하여 받은 결과가 model에 담긴다.

     

    이후 forEach까지 돌린 후 안에서 row.getDataValue()를 호출할 때 'unknown[], unknown' 타입에 해당 함수가 정의되지 않았다며 에러를 발생시켰다.

     

    뭐가 다른가 해서 타고 들어가서 비교해봤다.

     

    findAll()과 같은 시퀄라이즈 내장 DB 함수는 return으로 Promise<M | null>을 리턴한다.

    * M은 모델이다.

     

    더 타고 들어가면 Bluebird의 Bluebird<T>타입이라는 것을 알 수 있다.

     

    근데 query()를 타고 들어가보면 리턴 타입이 Promise<[unknown[], unknown]>으로 다른 타입인 것을 알 수 있다.


    모델을 리턴하지 않으니 모델 인스턴스의 기능들을 사용할 수 없는 것이다. (예를 들면 get()이나 getDataValue(), setDataValue()등...)

     

    그럼 unknown 타입은 아무런 기능을 제공하지 않는데 도덕책 억덕계 해야 하는가... 찾아보려고 해도 원하는 정보가 전혀 없어서 그냥 직접 이리저리 만져보다가 알아냈다.

     

    우선 쿼리 결과를 매핑할 수 있는 인터페이스를 먼저 정의하고

    export default interface ModelInterface {
        some: string;
        thing: number;
    }

     

     

    아래 처럼 쿼리 결과 객체에 대해 인터페이스 타입을 지정해준다.

    import ModelInterface from '../interface/ModelInterface';
    
    const query: string = `SELECT ~~~~ FROM ~~~~`;
    const replacements: object = {
        something: 'something'
    }; 
    
    const model = (await Model.sequelize!.query(query, {
        replacements
    })) as ModelInterface;
    
    model.forEach(row => {
        row.some;
        row.thing;
    });

     

     

    이후 인터페이스의 속성을 찍어서 호출하여 사용할 수 있다.

     

    이거 때문에 좀 고생했다.

    '개발일지' 카테고리의 다른 글

    2019-10-14 개발일지  (0) 2019.10.14
    2019-10-11 개발일지  (0) 2019.10.11
    2019-10-08 개발일지  (0) 2019.10.08
    2019-10-07 개발일지  (0) 2019.10.08
    2019-10-04 개발일지  (0) 2019.10.04
Designed by Tistory.