node.js

계층형 아키텍처로 프로젝트 작성하기 03 (default 오류)

늘곰's 2023. 9. 18. 11:40

계층형 아키텍처로 코드를 작성하는게 사실상 처음이다보니 하나하나 계속 오류가 뜨고있다....

이번엔 새로운 오류가 발생해서 적어두려고한다.

 

이건 내가 만들고잇는 게시판 프로젝트의 컨트롤러 부분이다.

여기서 export default class 이런식으로 default 를 넣으면 오류가 생겼다.

컨트롤러

//import {ProjectService} from './service.js'



export default class ProjectController {
constructor(projectService){
 this.projectService = projectService;
}

// projectService = new ProjectService();  

 /* 프로젝트 생성 */
 createProject = async(req,res,next) =>{
    //const {id} = req.user;
    const {title, description, image, liveSiteUrl, githubUrl, category} = req.body;

    const project = await this.projectService.createProject(
        //id,
        title,
        description,
        image,
        liveSiteUrl,
        githubUrl,
        category,
      );

      return res.status(201).json({project});
 }

 /* 프로젝트 목록 조회 */
 getProject = async(req,res,next) =>{

 }

/* 프로젝트 상세 조회 */
getByIdProject = async(req,res,next) =>{

 }
 
/* 프로젝트 수정 */
updateProject = async(req,res,next) =>{

 }

 /* 프로젝트 삭제 */
 deleteProject = async(req,res,next) =>{

 }

    


}

import {ProjectController} from './contoller.js';
        ^^^^^^^^^^^^^^^^^
SyntaxError: The requested module './contoller.js' does not provide an export named 'ProjectController'
오류의 메세지는 이렇다.

 

작성한 라우터

import express from "express";
import {prisma} from '../utils/prisma/index.js';
import {ProjectController} from './contoller.js';
import {ProjectService} from "./service.js";
import {ProjectRepository} from "./repository.js";

const router = express.Router();

// 인스턴스 생성
const projectRepository = new ProjectRepository(prisma);
const projectService = new ProjectService(projectRepository)
const projectController = new ProjectController(projectService);



// /* 게시글 생성 */
 router.post('/', projectController.createProject);
//validate 추가 필요

// /* 게시글 목록 조회 */
router.get('/', projectController.getProject)


/* 게시글 상세 조회 */
router.get('/:postId', projectController.getByIdProject)

/* 게시글 수정 */
router.put('./postId', projectController.updateProject)
//validate 추가 필요

/* 게시글 삭제*/
router.delete('./postId', projectController.deleteProject)


export default router;

문제해결

export default를 사용하지 않을 때

모듈에서 'export default'를 사용하지 않으면 해당 모듈에서 내보내는 것은 명명된 내보내기(named exports)입니다. 이 경우 모듈에서 내보내는 것은 객체 또는 함수 등 여러 항목 중 하나일 수 있으며, 가져올 때 중괄호({})를 사용하여 해당 항목을 지정해야 합니다.

{} 를 명시적으로 기입해서 써야함

 

export default를 사용할 때

'export default'를 사용하면 해당 모듈에서 기본 내보내기(default export)가 됩니다. 이 경우 모듈에서 하나의 항목만 내보내야 하며, 가져올 때 중괄호({}) 없이 해당 항목을 가져옵니다.

중괄호 없이 써야함

 

한마디로 라우터에서 난 중괄호로 import 를 했는데 다른쪽에서 default 를 사용해서 오류가 난것

export  class ProjectController {
constructor(projectService){
 this.projectService = projectService;
}
수정후 

[nodemon] restarting due to changes...
[nodemon] starting `node src/app.js`
3999 번 서버가 열렸습니다

서버가 제대로 열림