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

admin님의 프로필 이미지

작성한 질문수

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

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

작성

·

226

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

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

2021. 07. 26. 19:37

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

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

2021. 07. 27. 14:12

답변 감사합니다. 그리고 말씀하신 것과 같이 변경했습니다. 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이 뜹니다.

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

2021. 07. 27. 14:28

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

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

2021. 07. 27. 14:59

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()

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

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

2021. 07. 27. 15:34

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

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

2021. 07. 27. 15:44

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'}
           )
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2021. 07. 27. 15:53

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

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

2021. 07. 27. 15:57

[]

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

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

2021. 07. 27. 16:04

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

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

2021. 07. 27. 16:52

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

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

2021. 07. 31. 21:24

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
질문자

2021. 08. 02. 16:54

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
질문자

2021. 08. 02. 16:57

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도 같이 공유 해드립니다.. 답변 주셔서 늘 감사드립니다.

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

2021. 08. 02. 17:11

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

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

admin님의 프로필 이미지

작성한 질문수

질문하기