Node.js中的Multer中间件在req.body中返回空对象,在req.file中返回未定义对象



问题是,当我使用multer并在Postman中发送请求时,req.body是一个空对象,req.file是未定义的。我已在poster中取消选中内容类型标头。

这是代码:

//Route
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../uploads/');
},
filename: function (req, file, cb) {
cb(null, new Date().toISOString() + file.originalname);
}
});
const upload = multer({
storage,
limits: {fileSize: 1024 * 1024 * 10}
});
router.post('/test', upload.single('profilePicture'), authController.test);
//Controller
const test = (req, res) => {
console.log(req.body)
console.log(req.files)
res.json({body:req.body, files:req.files})
}
//app.js
app.use(express.json({extended: true, limit: '30mb'}));
app.use(express.urlencoded({extended: true, limit: '30mb'}))
app.use(cookieParser());
app.use('/api/auth', authRoutes);
app.use('/api/product', productRoutes);
app.use('/api/profile', profileRoutes);

编辑:原来,问题出在邮差身上。我从React应用程序向axios提出了一个请求,一切都正常。所以问题是,为什么它在Postman中不起作用?是软件中的一些Bug,还是我们应该更改一些设置?

问题是Nodejs默认使用Ansynchornus Javascript。与传统的JS编程相比,您需要使用async-await方法和try-catch-finally方法。

所以你的控制器看起来像

//Route
router.post('/test', async (req, res, next)=>
{
try{
await upload.single('profilePicture')
next()
} catch(err){
console.log(err)
res.send('failed!')
}, 
authController.test);
//Controller
const test = async (req, res) => {
try{
console.log(req.body)
console.log(req.files)
res.json({body:req.body, files:req.files})
} catch(err){
console.log(err);
}
}

对答案的补充。如果您只想访问上传的图像,那么您应该使用buffer

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })

最新更新