Здравствуйте!
Подскажите, пожалуйста, возможно ли отрефакторить этот код:
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)
})
}
}