express.json() chỉ parse body có Content-Type: application/json; express.urlencoded() chỉ parse application/x-www-form-urlencoded. Form có file được browser gửi dưới dạng multipart/form-data — body bị chia thành nhiều phần ngăn bởi chuỗi boundary, mỗi phần có header riêng. Không parser nào trong hai cái trên hiểu định dạng đó, nên req.body rỗng và req.file không tồn tại.
Dùng multer (middleware chính thức của Express):
js
import multer from 'multer'
const upload = multer({
storage: multer.diskStorage({ destination: '/tmp/uploads' }),
limits: { fileSize: 5 * 1024 * 1024 }, // 5 MB
})
app.post('/avatar', upload.single('avatar'), (req, res) => {
res.json({ path: req.file.path, name: req.body.name })
})Multer điền req.file (hoặc req.files) và vẫn đặt các field text vào req.body.
Luôn khai báo limits.fileSize và kiểm tra mimetype — thiếu giới hạn là một lối tấn công cạn tài nguyên.