본문 바로가기
개발/차근차근 개발일지 TIL

TIL 230504 시험_CRUDAPI_INDEX파일 없음 오류(어이없음주의)

by 코딩하는짱구 2023. 5. 4.
반응형

✅오늘 학습 Keyword

 

✅오늘 겪은 문제 및 해결

명시된 것 처럼 아주 간단한 게시글 CRUD API를 만드는 것이였다.. 

코드를 전부 작성하고 서버를 연결하려는데 아래와 같은 오류가 뜨기 시작했다. 

 

 


$ node app.js
node:internal/modules/cjs/loader:1078
  throw err;
  ^

Error: Cannot find module '../models'
Require stack:
- C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\routes\posts.router.js
- C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\routes\index.js
- C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\app.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)
    at Module._load (node:internal/modules/cjs/loader:920:27)
    at Module.require (node:internal/modules/cjs/loader:1141:19)
    at require (node:internal/modules/cjs/helpers:110:18)
    at Object.<anonymous> (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\routes\posts.router.js:3:19)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Module.require (node:internal/modules/cjs/loader:1141:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    'C:\\Users\\cryst\\OneDrive\\바탕 화면\\sparta\\NODE JS\\주특기주차\\230504 TEST\\routes\\posts.router.js',
    'C:\\Users\\cryst\\OneDrive\\바탕 화면\\sparta\\NODE JS\\주특기주차\\230504 TEST\\routes\\index.js',
    'C:\\Users\\cryst\\OneDrive\\바탕 화면\\sparta\\NODE JS\\주특기주차\\230504 TEST\\app.js'
  ]
}

Node.js v18.15.0


 

에러에 따르면 models의 Posts 모델을 찾을 수 없다는 내용이다.

Posts 의 모델 코드도 수없이 검토하고, posts.router에 올바른 경로로 설정이 되있는지, 오타가 있는지도 100번은 읽어봤는데 틀린 곳이 없었다. 

//models.posts.js
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Posts extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {}
  }

  Posts.init(
    {
      id: {
        allowNull: false, // NOT NULL
        autoIncrement: true, // AUTO_INCREMENT
        primaryKey: true, // Primary Key (기본키)
        type: DataTypes.INTEGER,
      },
      title: {
        allowNull: false, // NOT NULL
        type: DataTypes.STRING,
      },
      content: {
        allowNull: false, // NOT NULL
        type: DataTypes.STRING,
      },
      createdAt: {
        allowNull: false, // NOT NULL
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
      updatedAt: {
        allowNull: false, // NOT NULL
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
    },
    {
      sequelize,
      modelName: 'Posts',
    }
  );
  return Posts;
};

 

//posts.router.js
const express = require('express');
const router = express.Router();
const { Posts } = require('../models/posts.js');

//게시글생성

const createNewPost = async (req, res) => {
  const { title, content } = req.body;
  const createdPosts = await Posts.create({
    title,
    content,
  });

  return res.status(200).json({ data: createdPosts });
};

// //게시글조회

const getAllPosts = async (req, res) => {
  const posts = await Posts.findAll({
    attributes: ['id', 'title', 'content', 'createdAt', 'updatedAt'],
    order: [['createdAt', 'DESC']],
  });
  return res.status(200).json({ data: posts });
};

// //게시글수정

const updatePost = async (req, res) => {
  const { postId } = req.params;
  const { title, content } = req.body;

  const post = await Posts.findOne({
    where: { id: postId },
  });
  (post.title = title), (post.content = content);
  post.updatedAt = new Date();
  await post.save();
  return res.status(200).json({ message: '게시글을 수정하였습니다.' });
};

// //게시글삭제
const deletePostById = async (req, res) => {
  const { postId } = req.params;
  const post = await Posts.findOne({
    where: { id: postId },
  });
  await post.destroy();
  return res.status(200).json({ message: '게시글을 삭제하였습니다.' });
};

router.post('/', createNewPost);
router.get('/', getAllPosts);
router.put('/:postId', updatePost);
router.delete('/:postId', deletePostById);

module.exports = router;

아무리 봐도 틀린 곳이 없는데 서버가 연결이 되지않아서, 

posts.router에 Posts모델을 불러오는 곳을 const {Posts}=require('../models/posts.js')로 수정해보았다. 

//결론적으론 const {Posts}=require('../models') 가 맞습니다.

 

이렇게 하면 서버 연결 자체는 되지만, 이번에는..

 

 

 

 


$ node app.js
Server listen 3000
C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\routes\posts.router.js:9
  const createdPosts = await Posts.create({
                                   ^

TypeError: Cannot read properties of undefined (reading 'create')
    at createNewPost (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\routes\posts.router.js:9:36)
    at Layer.handle [as handle_request] (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\index.js:284:15
    at Function.process_params (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\index.js:346:12)
    at next (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\index.js:280:10)
    at Function.handle (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\index.js:175:3)
    at router (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\230504 TEST\node_modules\express\lib\router\index.js:47:12)

Node.js v18.15.0

 

 


이런 에러가 뜬다..미치겠다 진짜!!! 수도없이 반복해왔고 문제 없이 진행했던 코딩인데 계속 오류가 나니 멘붕이 올 것 같았다. 오류 내용은 객체나 변수의 속성을 잘못 참조하여 발생한 문제이고, create메소드를 호출하기 전에 'Posts'객체가 정의되지 않았기 때문에 'undefined'가 뜬다는 것인데, models 잘 설정해놨잖아... 대체 뭐가문제야 ㅠㅠㅠㅠㅠㅠ

 

그래서 대략 한시간 반 가량 도대체 뭐가 문제일까 열심히 찾아봤는데, 

아무리 봐도..아무리 봐도..아무리 봐도....없던 문제를 찾아냈다.

 

바로바로...

 

models에 index 파일이 없었다^^*

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

sequelize로 생성한 모델들을 import할 수도 export할 수도 없으니 에러가 계속 나는 것이였다...

 

index를 추가해주니 모든게 정상적으로 작동하였다..

 

✅오늘 알게된 점 및 계획

1.

**models/index.js의 역할

-sequelize cli를 통해 생성

-config/sequelize.json의 설정값을 읽어 sequelize를 생성한 후 models 폴더 아래에 정의한 model관련 js파일을 모두 

로딩하여, db객체에 Model을 정의한 후 반환

 

2. 중요중요

models의 Model을 불러올 때 

const { Posts } = require('../models/posts.js')가 아닌

const { Posts } = require('../models') 로 불러와야 작동되는 이유.

Sequelize에서 /models를 통해 models디렉토리에 있는 모델을 불러올 수 있다. 

models를 사용하는 것이 유지보수성을 높임.

 

**참고

https://stackoverflow.com/questions/61718082/sequelize-model-is-not-associated-with-model

 

지금 단계에선 속도가 아닌 정확성이 중요하다는 것을 또 한번 느끼는 날. 코딩을 하는 단계와 단계에서 어떤 작업이 이루어지고, 그 관계들이 어떻게 이어지는지 정확히 파악하면서 학습해야겠다.

그래도 오늘 에러에 관해선 절대 안까먹을 것 같아서 기분좋다~!

반응형