강의

멘토링

커뮤니티

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

hib4888님의 프로필 이미지
hib4888

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

게시글 좋아요

[SequelizeEagerLoadingError]: Post is not associated to Post! 에러 질문드립니다.

해결된 질문

작성

·

881

0

좋아요한 게시글을 마이페이지에서 확인하고 싶어서 기능을 구현했는데 다음과 같이 Post끼리는 관계가 없다고 에러가 발생하더라고요

처음에 구현하고나서는 잘 동작했는데 갑자기 재실행하니까 다음과 같은 오류가 발생하더라고요

router쪽에서 발생하는 에라같은데 혹시 이유에 대해서 알 수 있을까요?

 

에러 로그

SequelizeEagerLoadingError: Post is not associated to Post!
    at Function._getIncludedAssociation (C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\node_modules\sequelize\lib\model.js:565:13)
    at Function._validateIncludedElement (C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\node_modules\sequelize\lib\model.js:502:53)
    at C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\node_modules\sequelize\lib\model.js:421:37
    at Array.map (<anonymous>)
    at Function._validateIncludedElements (C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\node_modules\sequelize\lib\model.js:417:39)
    at Function.findAll (C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\node_modules\sequelize\lib\model.js:1118:12)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Function.findOne (C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\node_modules\sequelize\lib\model.js:1228:12)
    at async C:\Users\Administrator\OneDrive\Desktop\Recipe.io\prepare\back\routes\post.js:122:18
PATCH /post/15/like 500 7.755 ms - 1344

 

postcard

const onLikePost = useCallback(() => {    
    dispatch(likePostRequestAction(post.id));
    message.success('게시글이 스크랩에 추가되었습니다.', 3);
  }, []);
  const unLikePost = useCallback(() => {
    dispatch(unLikePostRequestAction(post.id));
    message.error('게시글이 스크랩에서 제거되었습니다.', 3);
  }, []);

reducer

case LIKE_POST_SUCCESS: {
          const post = draft.mainPosts.find((v) => v.id === action.data.id);
          post.Likers.push({ id: action.data.UserId });                    
          draft.likePostLoading = false;
          draft.likePostDone = true;
          break;
        }
      case LIKE_POST_FAILURE:
        draft.likePostLoading = false;
        draft.likePostError = action.error;
        break;
      case UNLIKE_POST_REQUEST:
        draft.unLikePostLoading = true;
        draft.unLikePostDone = false;
        draft.unLikePostError = null;
        break;
      case UNLIKE_POST_SUCCESS: {
          const post = draft.mainPosts.find((v) => v.id === action.data.PostId);
          post.Likers = post.Likers.filter((v) => v.id !== action.data.UserId);
          draft.unLikePostLoading = false;
          draft.unLikePostDone = true;
          break;
        }
      case UNLIKE_POST_FAILURE:
        draft.unLikePostLoading = false;
        draft.unLikePostError = action.error;
        break;
     
case SCRAP_ADD_POST_TO_ME:
        draft.me.Liked.unshift(action.data);
        break;
      case SCRAP_REMOVE_POST_OF_ME:
        draft.me.Liked = draft.me.Liked.filter((v) => v.id !== action.data.id);
        break;

saga

function likePostAPI(data) {
  return axios.patch(`/post/${data}/like`);
}

function* likePost(action) {
  try {
    const result = yield call(likePostAPI, action.data);          
    yield put({
      type: LIKE_POST_SUCCESS,
      data: result.data,
    })
    yield put({
      type: SCRAP_ADD_POST_TO_ME,
      data: result.data,
    })
  } catch(err) {
    yield put({ 
      type: LIKE_POST_FAILURE,
      data: err.response.data 
    })
  }  
}

function unLikePostAPI(data) {
  return axios.delete(`/post/${data}/like`);
}

function* unLikePost(action) {   
  try {
    const result = yield call(unLikePostAPI, action.data);
    yield put({
      type: UNLIKE_POST_SUCCESS,      
      data: result.data,
    })
    yield put({
      type: SCRAP_REMOVE_POST_OF_ME,
      data: result.data,
    })
  } catch(err) {
    yield put({ 
      type: UNLIKE_POST_FAILURE,
      data: err.response.data 
    })
  }  
}

router

router.patch('/:postId/like', isLoggedIn, async (req, res, next) => { // likePostAPI / PATCH /post/1(게시글번호)/like
  try {
    const post = await Post.findOne({ 
      where: { id: req.params.postId },
      include: [{
        model: Post,
        include: [{
          model: Image,
        }, {
          model: Comment,
          include: [{
            model: User,
            attributes: ['id', 'nickname'],
          }],
        }, {
          model: User,
          attributes: ['id', 'nickname'],
        }, {
          model: User,
          as: 'Likers',
          attributes: ['id'],
        }]
      }],
    });
    if (!post) {
      return res.status(403).send('게시글이 존재하지 않습니다.');
    }
    await post.addLikers(req.user.id);        
    res.status(200).json(post);
  } catch (error) {
    console.error(error);
    next(error);
  }
});

router.delete('/:postId/like', isLoggedIn, async (req, res, next) => { // unLikePostAPI / DELETE /post/1(게시글번호)/like
  try {
    const post = await Post.findOne({
      where: { id: req.params.postId },
    })
    if (!post) {
      return res.status(403).send('게시글이 존재하지 않습니다.');
    }
    await post.removeLikers(req.user.id);
    res.json({ PostId: post.id, UserId: req.user.id });
  } catch (error) {
    console.error(error);
    next(error);
  }
});

답변 1

0

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

시퀄라이즈 모델에서 발생하는 에러입니다. hasMany나 belongsTo가 빠졌을 것입니다.

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

답변 감사합니다.

질문전에 오류로그를 확인해보니 말씀처럼 시퀄라이즈 관계 오류를 확인했는데 문제가 없어보여서 질문드렸습니다.

// models/post.js
static associate(db) {
    db.Post.belongsTo(db.User);
    db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
    db.Post.hasMany(db.Comment);
    db.Post.hasMany(db.Image);
    db.Post.belongsToMany(db.User, { through: 'Like', as: 'Likers' });    
  }

// models/user.js
  static associate(db) {
    db.User.hasMany(db.Post);
    db.User.hasMany(db.Comment);
    db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked' })    
  }

 

제 생각에는 router의 await post.addLikers(req.user.id); 이 부분에서 오류가 발생한것같은데 게시글 좋아요는 post와 user간의 관계데이터아닌가요?

근데 db관계 설정은 문제가 없어보이는데 혹시 제가 잘못확인한 부분이 있을까요?

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

라우터에서 include를 잘못했었네요 해결했습니다.

번거롭게해드려서 죄송합니다

hib4888님의 프로필 이미지
hib4888

작성한 질문수

질문하기