• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

posts.js 라우터 파일에 문제가 생겼습니다

23.08.19 00:36 작성 23.08.19 00:39 수정 조회수 234

0

const express = require('express');

const { User, Post, Image, Comment } = require('../models');

const router = express.Router();
console.log(Post); // undefined
router.get('/', async (req, res, next) => {
  try {
    const posts = await Post.findAll({
      limit: 10,
      order: [
        ['createdAt', 'DESC'],
        [Comment, 'createdAt', 'DESC'],
      ],
      include: [{
        model: User,
        attributes: ['id', 'nickname'],
      }, {
        model: Image,
      }, {
        model: Comment,
        include: [{
          model: User,
          attributes: ['id', 'nickname'],
        }],
      }, {
        model: User,
        as: 'Likers',
        attributes: ['id'],
      }],
    });
    res.status(200).json(posts);
  } catch (error) {
    console.error(error);
    next(error);
  }
});

module.exports = router;

posts.js

const express = require('express');
const cors = require('cors');
const passport = require('passport');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const dotenv = require('dotenv');
const morgan = require('morgan');

const db = require('./models');
const passportConfig = require('./passport');
const postRouter = require('./routes/post');
const userRouter = require('./routes/user');
const postsRouter = require('./routes/posts');

dotenv.config();
db.sequelize.sync()
  .then(() => {
    console.log('db 연결 성공');
  })
  .catch(console.error);
passportConfig();
const app = express();

app.use(express.json()); 
app.use(express.urlencoded({ extended: true }));
app.use(cors({
  origin: true,
  credentials: true,
}));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
  saveUninitialized: false,
  resave: false,
  secret: process.env.COOKIE_SECRET,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(morgan('dev'));

app.use('/posts', postsRouter);
app.use('/post', postRouter);
app.use('/user', userRouter);

app.listen(3065, () => {
  console.log('3065포트 서버실행중');
});

app.js

(node:4192) Warning: Accessing non-existent property 'User' of module exports inside circular dependency
(node:4192) Warning: Accessing non-existent property 'Post' of module exports inside circular dependency
// 생략

영상보면서 코딩중에
위 문구와 함께 ../models에서 require한 것이
존재하지 않는 문제가 발생했습니다.

const { Post } = require('../models')
console.log(Post) 출력결과 undefined 입니다

이 문제가 posts.js 파일에서만 발생했습니다.
(user.js, post.js는 정상)
그래서 postss.js 라는 이름이 다르고 코드만 옮긴 파일을 만들어서 다시 시도해보았습니다.
(rename시 module not found 에러 발생)
그랬더니 ../models에서 require 한것이 존재했습니다.


근데 요청시
라우터(method: get, url: /posts)의 미들웨어가 실행이 안되는 문제가 있었습니다.
상태코드는 300 Multiple Choices 였습니다

이번에는 url를 바꿔서 요청을 보냈습니다
ex) /posts/test
그랬더니 성공했습니다.

왜 이런 현상이 발생했는지
어떻게 해결할 수 있는지 모르겠어서 질문남깁니다!

답변 2

·

답변을 작성해보세요.

0

에러 메시지에 적혀있는대로 순환참조 문제입니다.

a 파일은 b를 참조하고, b 파일은 a를 참조해서 그렇습니다.

근데 제 강의에서는 이 문제가 발생할리가 없는데 뭔가 문제가 있어 보이네요.

박규석님의 프로필

박규석

질문자

2023.08.19

답변해주셔서 감사합니다

제가 멍청하게도 post model 파일에서
posts.js를 require했네요...
주석 작성하면서 자동완성된듯 합니다...

해당 코드를 지우는 것으로 순환참조 문제는 해결됐습니다.
그리고 요청시 상태코드가 300 그대로인 문제는 개발자도구에서 disable cache했더니 해결됐습니다..

쉽게 해결할 에러였는데 이것 때문에 몇시간을 썼네요 ㅠㅠ
에러메시지를 잘 읽어보고 꼼꼼하게 살펴봐야겠습니다.

 

0

박규석님의 프로필

박규석

질문자

2023.08.19

오타 수정했습니다