промежуточное программное обеспечение multer не распознает тело запроса

#javascript #node.js #file-upload #multer

Вопрос:

 const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "public/images");
  },
  filename: (req, file, cb) => {
    console.log(req.body); // <- This will output null object
    cb(null, file.originalname);
  },
});

const upload = multer({ storage });
app.post("/api/upload", upload.single("file"), (req, res) => {
  try {
    return res.status(200).json(req.body);
  } catch (err) {
    console.log(err);
  }
});
 

Запрос почтальона:
введите описание изображения здесь

Вывод на консоль:

 >>>>>>>>>>>>>SERVER STARTED<<<<<<<<<<<<<
(node:3741192) [MONGODB DRIVER] Warning: Top-level use of w, wtimeout, j, and fsync is deprecated. Use writeConcern instead.
(node:3741192) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
Connected to MongoDB
[Object: null prototype] {}
::1 - - [08/Jun/2021:12:11:21  0000] "POST /api/upload HTTP/1.1" 200 23
 

Моя проблема в том, что внутри:

   filename: (req, file, cb) => {
    console.log(req.body); // <- This will output null object
    cb(null, file.originalname);
  },
 

req.body является пустым объектом. Но этого не должно быть? В запросе почтальона я включил name свойство.

Ответ №1:

Из документации multer:

Обратите внимание, что тело запроса, возможно, еще не полностью заполнено. Это зависит от того, в каком порядке клиент передает поля и файлы на сервер.

Таким образом, изменение порядка в вашей форме почтальона и установка name перед file (вы можете просто перетащить/удалить строку) устранит проблему.

Комментарии:

1. Это прекрасно сработало, спасибо. Но я следовал учебнику, и это тот порядок, который использовал парень, который делал учебник. Это сработало для него. Есть ли причины, по которым разница?

2. Хороший вопрос, не уверен, в чем может быть причина, извините.