@HitGirl

Как переписать данный пример используя контроллер?

Здравствуйте!
Подскажите, пожалуйста, возможно ли отрефакторить этот код:
export default function uploadsRoutes(router: Router) {
    router.post('/upload/post/main',authMiddleware,async (req:Request,res:Response,next:NextFunction)=>{
        const dir = path.join(process.cwd(),`uploads/temp/${req.userID}/post/main/`)
        readdirSync(dir).forEach(f => rmSync(`${dir}/${f}`));
        next()
    }, fileUploadMiddleware((req)=>`uploads/temp/${req.userID}/post/main/`),async (result:any,req:Request,res:Response,next:NextFunction)=>{
        if (typeof result == "string"){
            return res.json({
                // url: `/uploads/post/main/${req.file!.filename}`,
                url: `uploads/temp/${req.userID}/post/main/${result}`,
            });
        }
        next(result)
    }); 
}

убрав цепочку промежуточного по и добавив вызов метода контроллера?
router.post('/upload/post/main',authMiddleware,uploadController.addMainImage);


class UploadController {
    async addMainImage(req: Request, res:Response, next: NextFunction) {
        try {

//????????

} catch (error) {
            next(error);
        }
    }
}

export default new UploadController()


export default function fileUploadMiddleware(dest:((req:Request)=>string)|string = "uploads/", types:string[]=["image/jpeg","image/jpg","image/png","image/gif"]){
    function getFileExtension(filename:string){
        const ext = filename.split(".").pop()

        return ext ? "."+ext: "";
    }

    const fileFilter: multer.Options['fileFilter'] = (req,file,cb)=>{
        if (types.includes(file.mimetype)){
            cb(null, true)
        }else{
            cb(new Error('Доступны только следуюшие типы файлов: '+types.join("; ")));
        }
    }



    return function (req: Request, res:Response, next: NextFunction) {
        function getDest(){
            if (typeof dest === "string") {
                return dest;
            }
            else return dest(req)
        }

        const destination = getDest()

        let newFilename = ""
        const storage = multer.diskStorage({
            destination: (_, __, cb) => {
                if (!fs.existsSync(path.join(process.cwd(),destination))) {
                    fs.mkdirSync(path.join(process.cwd(),destination),{ recursive: true });
                }
                cb(null, destination);
            },
            filename: (_, file, cb) => {
                newFilename = new Date().toISOString().replace(/:/g , "-")+getFileExtension(file.originalname)
                cb(null, newFilename);
            },
        })

        const limits = config.file

        const uploader = multer({storage, limits, fileFilter})

        uploader.single("file")(req, res,function (err) {
            //файлы не появились в uploads
            if (err instanceof multer.MulterError) {
                switch (err.code){
                    case "LIMIT_UNEXPECTED_FILE":
                        // res.send("Превышено максимальное количество файлов для загрузки")
                        next(ApiError.BadRequest("Превышено максимальное количество файлов для загрузки",[]))
                        break;
                    case "LIMIT_FILE_SIZE":
                        // res.send("Превышен максимальный размер файла")
                        next(ApiError.BadRequest("Превышен максимальный размер файла",[]))
                        break;
                    case "LIMIT_FIELD_KEY":
                        // res.send("Название файла слишком длинное")
                        next(ApiError.BadRequest("Название файла слишком длинное",[]))
                        break;
                    default:
                        // res.send(err)
                        next(ApiError.BadRequest(err.message,[]))
                }
                //  if (err.code === 'LIMIT_UNEXPECTED_FILE')


            } else if (err) {
                // next(err.message)
                next(ApiError.BadRequest(err.message,[]))
            }
            else
                // Everything went fine.
                next(newFilename)
        })


    }
}
  • Вопрос задан
  • 14 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы