앙큼한 개발기록

sequelize converting circular structure to json 본문

개발/nodejs

sequelize converting circular structure to json

angkeum 2021. 9. 10. 11:08

sequelize에서 findAll을 이용하여 model list을 호출해서 map으로 데이터를 돌리고 

해당 데이터를 customize 하던 중 해당 에러가 발생했다. 

 

include되어 있는 model을 sequelize를 이용하여 데이터를 object 위로 올릴수 있지만 query 짜는게 복잡하고 조건이 너무 많아 추출하여 데이터를 집어 넣는 과정에서 해당 에러가 발생한다. 

 

해결 방법으로는 해당 데이터를 map으로 돌릴때 data자체를 사용하는게 아닌 data.dataValues를 사용하면 JSON 데이터에 circular structure가 발생하지 않는다. 

 

sequelize에서 include 된 모델은 get set으로 모두 가지고 있는데 

외부에서 해당 데이터를 집어 넣거나 둘다 include로 belongsto , hasmany를 가지고 있는 경우 

json data가 무한 순환 구조로 반복되어 발생하는 에러 이다. 

 

ex) 사용자와 사용자가 가지고 있는 sns 가 있고 각각의 포인트 정보를 위로 올리는 경우.

(억지로 만든 데이터라서 뭔가 이상하면 알려주세요.)

const User = sequelize.define('user', {
  name: DataTypes.STRING,
  points: DataTypes.INTEGER
}, {
	timestamps: false 
});

const SNS = sequelize.define('sns', {
  name: DataTypes.STRING,
  type: DataTypes.INTEGER,
  typeName: {
  	type: DataTypes.VIRTUAL,
    get: function () {
    	let type = this.getDataValues('type');
        switch(type) {
        	case 0 :
            	return 'naver'
            case 1 :
            	return 'kakao'
            case 2 :
            	return 'google'
            case 3 :
            	return 'facebook' 
            default :
            	return 'none'
        }
    }
  },
  point: DataTypes.INTEGER,
}, { 
	timestamps: false 
});

User.hasMany(SNS)

SNS.belongsTo(User)

let userList = User.findAll({
	include:{
    	model: SNS
    }
})

userList.map(e => {
    
    // user를 바로 사용 안하고 dataValue를 사용한다. 
    let userData = e.dataValues
    let sns = userData.sns
    
    let user = {
    	...userData,
        sns,   
    }
    
    // 사용자가 가지고 있는 sns 타입 이름에 포인트를 넣어준다.
    sns.forEach(e => {
    	user[e.typeName] = e.point
    })
    
    return user
});

 

 

'개발 > nodejs' 카테고리의 다른 글

[node] Data truncated for column '이름' at row 1  (0) 2022.12.15
Comments