inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

multer 사용하기

multer랑 프론트랑 결합하는 과정에서 질문있습니다.

560

한상일

작성한 질문수 5

0

안녕하세요

영상을 보다가 프론트랑 결합해서 작은 프로젝트를 만들어 보고있습니다.

multer를 적용하고 프론트와 결합하는 과정에서 이미지를 선택하면 콘솔에 지속적으로 500에러가 발생해서 찾아보고 시도했으나 방법을 찾지못해 질문드립니다.

백엔드 + 프론트 = Node - v18.7.0

프론트 주요 라이브러리 버전 = React-18.2.0, Next = 12.3.1, TypeScript = 4.8.4

백엔드의 경우 타입스크립트 미 사용중입니다.

백엔드랑 프론트는 별도의 프로젝트로 만들어서 따로 관리중이며 프론트는 리덕스나 리코일 같은 별도 상태관리 라이브러리 미사용중입니다.

 

  1. 백엔드 에러메시지

TypeError: Cannot read properties of undefined (reading 'filename')

at /Users/Desktop/Temp-toyProject-Backend/Routes/TempPost.js:31:39

이며 해당 부분에서 이 부분이 문제가 되는게 아닐까? 하는 부분은 다음과 같습니다.

const upload = multer({
  storage: multer.diskStorage({
    destination(req, file, cb) {
      cb(null, 'uploads/');
    },
    filename(req, file, cb) { <<<< ?????
      const ext = path.extname(file.originalname);
      cb(null, path.basename(file.originalname, ext) + Date.now() + ext);
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
});

router.post('/img',  upload.single('img'), (req, res) => {

res.json({ url: `/img/${req.body.file.filename}` }); // <<< 에러가 나오는 31줄 
});

multer를 사용한 부분은 강사님의 영상에서 별도로 제작하신 미들웨어 등 몇가지 빼고는 그대로 가지고왔습니다.

2.백엔드와 결합되는 프론트 코드

const [content, setContent] = useState("")

  const [img, setImage] = useState<File>()

  const onChangeTitle = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
      setContent(e.target.value)
  },[])

    const onChanges = useCallback((e:React.ChangeEvent<HTMLInputElement>) => {
      e.preventDefault()
      const formData = new FormData()
      formData.append('img', img)

      axios.post('http://localhost:8005/temppost/img', formData, { // <<< 백엔드 코드의 부분
          headers: { 'Content-type': 'multipart/form-data' }, 
      })
      .then((res) => {
     console.log(res.data)
      })
      .catch((error) => {
          console.error(error)
      })
  },[img])

    const onSubmit = useCallback((e:any) => {
      e.preventDefault()
      axios.post('http://localhost:8005/temppost', { 
        headers: { 'Content-type': 'multipart/form-data' },
          img ,
          content : content 
      })

      .then((res) => { 
     console.log(res.data)
      })

      .catch((error) => {
          console.error(error)
      })
  },[img,content])

return (
   <form encType="multipart/form-data" > // 이미지와 content를 입력받고 보내는 부분
         <input type="file" name="img" onChange={onChanges} />
        <input name="content" type="text"  onChange={onChangeTitle}  />
        <input type="submit"  onClick={onSubmit}/>
    </form>

)

프론트쪽의 경우 다른걸 참고하긴 했는대 이미지와 관련된 state는 타입을 저렇게 <File>로 줘도 될까요?

 

항상 영상 잘 보고 있습니다 감사합니다..

 

 

 

mongodb nodejs mysql Sequelize

답변 1

0

제로초(조현영)

  1. req.file.filename입니다.

  2. File로 줄 때 에러가 발생하지 않는다면 옳게 주신 겁니다.

리눅스 노드 설치시 패키지

0

172

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

930

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2297

2

a[title] 질문드립니다

0

387

1

리뉴얼 강의 및 공부 방법

0

590

1

jwt decode

0

1138

1

node.js 교과서 3판 질문드립니다

0

397

1

passport와 jwt

0

439

1

리뉴얼 강의

0

428

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

359

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

490

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

511

2

nunjucks res.render('error'); 작동을 안합니다.

0

520

1

질문있습니다.

0

348

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3545

1

수업자료는 어디있나요?

0

374

1

질문 있습니디

0

245

1

multer 사용시 file 외 name값은 못받나용?

0

430

1

코드 중복 부분 질문드립니다.

0

303

1

api 만드는 이유 질문드립니다.

0

293

1

Strategy의 done에 대해 질문드립니다.

0

374

1

안녕하세요 fs 권한 관련 질문드립니다

0

456

1

시퀄라이즈 연결질문...

0

511

2

res.setHeader vs res.cookie

0

1798

3