[JavaScript] GridFs 1편

최예닮·2022년 12월 1일
0
post-thumbnail

어제 수많은 삽질을 한 결과!!! 두둥 !!!! 오늘 결국 DB에다 파일을 분할해서 저장하는걸 성공했다.진짜 감격의 눈물 ㅠㅠㅠ 자자 다 박수 짝짝짝 !!!

(닥쳐 말포이...)

자 그럼 어떤 오류가 나왔고 어떻게 해결했는지 지금 공개하겠다 !! 시작~~~ 합니다!!!!!!!!

(구현 완료된 코드)

const express = require("express")
const router = express.Router()
const multer = require("multer");
const { ObjectID } = require("mongodb");
const { Readable } = require("stream");
const { createModel } = require("mongoose-gridfs");

/**
 * POST /video
 */
 router.post("/", (req, res) => {
    const storage = multer.memoryStorage()
    const upload = multer({ storage: storage, limits: { fields: 1, files: 1 }});
    upload.single("file")(req, res, (err) => {
        if (err) {
            return res.status(400).json({ message: err });
        } else if(!req.body.name) {
            return res.status(400).json({ message: "파일 이름을 작성해주세요!" });
        }

        const readStream = Readable.from(req.file.buffer);
        const options = ({ filename: req.body.name, contenttype: "video/mp4"});
        Attachment = createModel();
        Attachment.write(options, readStream, (err, file) => {
            if (err)
                return res.status(400).json({message: "Bad Request"});
            else {
                console.log("보내졌어요! \n" + file.toString());
                return res.status(200).json({
                    message: "정상적으로 저장되었습니다!",
                    file: file,
            });
            }
        })
    });
});
});

module.exports = router

크게 달라진거는 없지만 어제 나온 에러중에 LIMIT_UNEXPECTED_FILE 이라는 아이가 있었다. 저거는 손쉽게 upload.single("track") 이라고 어제 코드에는 되어있었다. 하지만!! 선더클라이언트로 돌릴때에는 이름을 file로 했어서... 이름이 안맞으니까 저렇게 나오지 ㅎ



위에 두 개 차이 보이시죠잉?

그 다음 선더클라이언트로 돌려보자.!

.... 여전히 돌아가지는 않지만 ... 그래도 다른 오류메세지가 나왔다. 검색해보니까 fileSize 와 parts는 안적혀 있으면 디폴트 값으로 들어간다고 나와 있어서 (물론 그럼 파일 사이즈가 무제한이라 이거는 나중에 제한을 둬야할거 같다.) 두 단어를 빼주고

const upload = multer({ storage: storage, limits: { fields: 1, files: 1 }});

이렇게만 넣어주게 되면

짜잔!! 저렇게 length에 파일 크기와 chunkSize 얼마로 분할했는지가 나온다. 그럼 DB를 봐보자.

GridFS Buckets에 이름하고 파일사이즈 ID값이 잘 들어갔고 컬럼을 확인해보면 2가지가 있다.

요렇게 두개 ! files 안에는 선더클라이언트의 res 값이 들어가 있고, chunks에는 분할된 파일들이 들어간다. 한번 봐보자

와우 박수 👏👏👏👏 ... 잘되네... 그럼 혹시 GET을 하면 저 파일들이 한번에 합쳐져서 불러와질까 ??

그건 다음시간에 보여주겠다 ^^ 해결했으니 기분이 너무 좋다요 ^^

profile
산을 오르려고 하는데 이제 주차장에 막 주차한 초보개발자

0개의 댓글