#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:
Обратите внимание, что тело запроса, возможно, еще не полностью заполнено. Это зависит от того, в каком порядке клиент передает поля и файлы на сервер.
Таким образом, изменение порядка в вашей форме почтальона и установка name
перед file
(вы можете просто перетащить/удалить строку) устранит проблему.
Комментарии:
1. Это прекрасно сработало, спасибо. Но я следовал учебнику, и это тот порядок, который использовал парень, который делал учебник. Это сработало для него. Есть ли причины, по которым разница?
2. Хороший вопрос, не уверен, в чем может быть причина, извините.