Node.js returns 中的 Multer 中间件在 req.body 中为空 object,在 req.file 中未定义

Multer middlware in Node.js returns empty object in req.body and undefined in req.file

问题是当我使用 multer 并在 Postman 中发送请求时,req.body 是空的 object 而 req.file 是未定义的。我取消选中邮递员中的 content-type header。

代码如下:

//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);

编辑:原来是Postman的问题。我从 React 应用程序向 axios 发出请求,一切正常。那么问题来了,为什么它在 Postman 中不起作用?是软件中的一些错误还是我们应该更改某些设置?

问题是 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 })