본문 바로가기

node.js

[Sequelize] findAll한 데이터에서 dataValues 이외의 정보 버리기

⛔ dataValues 이외의 정보가 있을 때 문제점

sequelize findAll한 데이터를 보면 필요한 dataValues이외에 여러 데이터들이 있습니다. 보통 그런 데이터들을 그냥 두고 클라이언트로 전송해도 원하는 데이터만 전달됩니다. 그러나 graphql에서 sequelize.fn을 통해 추가한 새로운 attributes나 findAll한 데이터에 임의로 추가한 새로운 변수는 null로 읽어질 수 있습니다.(아래와 같은 경우)

let result = await Payment_item.findAll({ attributes: ['id', [sequelize.fn('COUNT', sequelize.col('id')), 'count']], }); result[0].dataValues.name = 'abc';

let result = await Payment_item.findAll({ 
  attributes: ['id', [sequelize.fn('COUNT', sequelize.col('id')), 'count']],
});
result[0].dataValues.name = 'abc';

 

👆 SOLUTION 1.

product_result = await Product.findAll({
  	raw: true									
})

findAll내에 raw: true옵션을 설정해두면 dataValues만 리턴됩니다. include할 연관 테이블이 없으면 이렇게 해도 괜찮지만 include하는 테이블이 있으면 아래와 같이 리턴됩니다. product_result[0].store.id 이런식으로 객체에서 관련 테이블 객체를 .로 이어서 바로 접근하지 못하고 product_result[0]['store.id']로 접근해야합니다.

{ id: 32,
  name: '당일진행',
  detail: '핫도그 하나 + 콜라 1잔',
  store_host_saying: '오늘만 사용 가능합니다.',
  validity_min: 2019-12-31T03:59:00.000Z,
  validity_max: 2019-12-31T03:59:00.000Z,
  deletedAt: null,
  storeId: 1,
  'product_imgs.id': 89,
  'product_imgs.upload_order_index': 0,
  'product_imgs.createdAt': 2019-12-05T09:37:36.000Z,
  'product_imgs.productId': 32
}

✌ SOLUTION 2.

result = result.map(el => el.get({ plain: true }));

include할 테이블이 있을 때는 다른 옵션없이 findAll을 한 후에, 위와 같이 실행하는 방법을 추천합니다. 원하는대로 findAll한 데이터에서 dataValues 부분만 반환됩니다.

 

반응형