Multer in Nextjs, req.file is undefined
pages/api/upload:
export default async (req: INextReq, res: NextApiResponse) => {
if (req.method !== "GET") {
return res.status(400).json({ success: false, message: "Use only GET method" });
}
return UploadLogics.testUpload(req)
.then((data) => res.status(200).json(data))
.catch((error) => res.status(400).json(error));
};
UploadLogics:
class UploadLogics {
static async testUpload(req: INextReq) {
uploadService("file", "SINGLE", "user");
return { file: `File: ${req.file}` };
}
}
uploadService:
export const config = {
api: {
bodyParser: false
}
};
export default (name: string, type: TType, directory: TDirectory) => {
const allowedTypes: Array<string> = ["SINGLE", "ARRAY"];
if (!allowedTypes.includes(type)) {
throw new Error(`Type ${type} not support. See this types: ${allowedTypes.join(", ")}`);
}
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, path.relative(`${PROJECT_ROOT}`, `./public/uploads/${directory}`));
},
filename: (req, file, cb) => {
cb(null, `${file.fieldname}_${Date.now}${path.extname(file.originalname)}`);
}
});
const image = multer({ storage, limits: { fieldSize: 25 * 1024 * 1024 } });
let upload = null;
switch (type) {
case SINGLE:
upload = image.single(name);
break;
case ARRAY:
upload = image.array(name);
break;
default:
return upload;
}
return upload;
};
Возвращает undefined при выводе req.file, что может быть не так?

Ответы (1 шт):
Автор решения: Алексей Яковлев
→ Ссылка
pages/api/upload:
import { check, validationResult } from "express-validator";
import { NextApiResponse } from "next";
import UploadLogics from "../../server/logics/upload.logics";
import { INextReq } from "../../server/middlewares/authentication.middleware";
import initMiddleware from "../../server/middlewares/init.middleware";
import validateMiddleware from "../../server/middlewares/validate.middleware";
import nc from "next-connect";
import uploadService from "../../server/services/upload.service";
const validateBody = initMiddleware(validateMiddleware(
[
check("file", "Вы должны выбрать фото").notEmpty()
],
validationResult
));
export const config = {
api: {
bodyParser: false
}
};
const handler = nc({
onError: (err, req, res: NextApiResponse, next) => {
console.error(err.stack);
return res.status(500).json({ success: false, message: "Something broke!" });
}
})
.use(uploadService("user").single("file"))
.post(async (req: INextReq, res: NextApiResponse) => {
if (req.method !== "POST") {
return res.status(400).json({ success: false, message: "Use only POST method" });
}
await validateBody(req, res);
return UploadLogics.testUpload(req)
.then((data) => res.status(200).json(data))
.catch((error) => res.status(400).json(error));
});
export default handler;
upload logics:
class UploadLogics {
static async testUpload(req: INextReq) {
return { file: `File: ${req.file.filename}` };
}
}
upload service:
import multer from "multer";
import path from "path";
type TDirectory = "user" | "post";
export default (directory: TDirectory) => {
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, `public/uploads/${directory}`);
},
filename: (req, file, cb) => {
cb(null, `${file.fieldname}_${Date.now()}${path.extname(file.originalname)}`);
}
});
const image = multer({ storage, limits: { fieldSize: 25 * 1024 * 1024 } });
return image;
};