인프런 커뮤니티 질문&답변

admin님의 프로필 이미지
admin

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

sequlize 관계 쿼리에서 get**, add** 등 추가로 사용할 수 있는 함수들이 not a function이 뜹니다.

작성

·

227

0

강의를 통해 짜고 있는 프로젝트에 content와 content_category를 있는 구조라 N:M 구조로 짜고 있습니다.

강의에서 hashTag와 post와 같이 N:M 구조로 belongsToMany의 구조로 되어 있습니다.

그래서 content 모델에는 다음과 같이 되어 있고

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'as : 'content_category_idk'foreignKey : 'content_category_idk'}
           )

content_category에서는

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'as : 'content_idk'foreignKey : 'content_idk'}
           )

다음과 같이 연결되어 있습니다.

하지만, 아래와 같이 belongsToMany 등 관계 커리에서 사용할 수 있는 get**, add** 등의 함수를 사용하고자 했을 때,

와 같이 not is function이 뜹니다.

그래서 ContentCategorys, ContentCategories 등 바꿔봐도 똑같습니다. 왜 그런가요?

답변 2

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

as를 잘못 쓰셨습니다. 저 이름은 as 따라갑니다. getContent_idk 이런 것으로 생성되었을 겁니다. as는 키 이름이 아니라 모델의 별명입니다. 그리고 foreignKey의 대상과 반대로 작성하셔야 합니다.

admin님의 프로필 이미지
admin
질문자

답변 감사합니다. 그리고 말씀하신 것과 같이 변경했습니다. foreignKey는 헷갈렸던 것 같습니다. 

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'foreignKey : 'content_category_idk'}
            )
       }

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'foreignKey : 'content_idk'}
           )

위와 같이 변경 이후에도 죄송하지만

const test = await Content.getContentCategory()

해당 함수가 not function이 뜹니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

테이블 지웠다가 다시 생성하시고, as 지정해주세요. as의 이름대로 갑니다.

admin님의 프로필 이미지
admin
질문자

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'foreignKey : 'content_idk'as : 'Content'}
           )

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'foreignKey : 'content_category_idk'as : 'ContentCategory'}
           )

as도 다 지정했었고, 아래와 같이 했었습니다.

const test = await Content.getContentCategory()

테이블도 한번 지우고 새로 생성하여 진행중입니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

as랑 foreignKey랑 반대 관계여야 합니다. as 두 개를 서로 바꾸세요.

admin님의 프로필 이미지
admin
질문자

const test = await Content.getContentCategory()

혹시 죄송하지만 이거 아닌가요..? 계속 not function이라고 뜨는데,, 

말씀 해주신대로 as 수정 한 뒤, 테이블  한번더 새로 생성해서 진행했습니다.

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'foreignKey : 'content_category_idk'as : 'Content'}
           )

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'foreignKey : 'content_idk'as : 'ContentCategory'}
           )
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

getContentCategories() 일 수도 있습니다.
console.log(Content.getContent, Content.getContents, Content.getContentCategory, Content.getContentCategories) 해서 어떤 메서드가 있나 보세요.

admin님의 프로필 이미지
admin
질문자

[]

메서드가 없다고 뜹니다..

admin님의 프로필 이미지
admin
질문자

네개 모두 undefined이 뜹니다.. 뭔가 혹시나 해서 getContentCategorys도 해봤습니다만 undefinded가 뜹니다. 혹시 셋팅을 따로 해야하는게 있나요..?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

지금 db에 Content, ContentCategory, content_category_join 테이블 세 개 모두 있죠? 처음 서버 실행 시 content_category_join을 만드는 sql을 봐야할 것 같습니다.

admin님의 프로필 이미지
admin
질문자

content 와 content_category로 생성하기 위해

modelName: 'ContentCategory',
tableName: 'content_category',

아래와 같이 셋팅하여

content, content_category로 생성 됐습니다.

아래가 content_category_join를 만드는 sql 입니다.

CREATE TABLE IF NOT EXISTS `content_category_join` (`created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, `content_idk` INTEGER , `content_category_idk` INTEGER , PRIMARY KEY (`content_idk`, `content_category_idk`), FOREIGN KEY (`content_idk`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`content_category_idk`) REFERENCES `content_category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

0

admin님의 프로필 이미지
admin
질문자

content 와 content_category로 생성하기 위해

modelName: 'ContentCategory',
tableName: 'content_category',

아래와 같이 셋팅하여

content, content_category로 생성 됐습니다.

아래가 content_category_join를 만드는 sql 입니다.

CREATE TABLE IF NOT EXISTS `content_category_join` (`created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, `content_idk` INTEGER , `content_category_idk` INTEGER , PRIMARY KEY (`content_idk`, `content_category_idk`), FOREIGN KEY (`content_idk`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`content_category_idk`) REFERENCES `content_category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

admin님의 프로필 이미지
admin
질문자

contents 생성 sql

CREATE TABLE IF NOT EXISTS `contents` (`id` INTEGER NOT NULL auto_increment , `pd_idk` INTEGER(11) NOT NULL, `state` TINYINT NOT NULL, `img1` VARCHAR(255) NOT NULL, `img2` VARCHAR(255), `img3` VARCHAR(255), `img4` VARCHAR(255), `img5` VARCHAR(255), `img6` VARCHAR(255), `satisfaction` TINYINT NOT NULL, `review_txt1` VARCHAR(255), `review_txt2` VARCHAR(255), `review_txt3` VARCHAR(255), `review_txt4` VARCHAR(255), `review_comment` VARCHAR(500) NOT NULL, `user_id` VARCHAR(45) NOT NULL, `order_product_idk` INTEGER(11) NOT NULL, `height` INTEGER(11) NOT NULL, `size` INTEGER(11) NOT NULL, `is_size_public` TINYINT NOT NULL, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`pd_idk`) REFERENCES `products` (`product_pk`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`order_product_idk`) REFERENCES `order_product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

content_category 생성 sql

CREATE TABLE IF NOT EXISTS `content_category` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(45) NOT NULL UNIQUE, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

혹시나 해서 관련 table 생성 sql도 같이 공유 해드립니다.. 답변 주셔서 늘 감사드립니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

https://stackoverflow.com/questions/49467654/what-methods-mixins-sequelize-adds-to-the-models-when-an-association-is-made

위 글 참고해서 어떤 메서드들이 있는지 찍어보세요.

admin님의 프로필 이미지
admin

작성한 질문수

질문하기