-
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