Поскольку вы используете multer с дисковым хранилищем, вам необходимо прочитать образ из временного местоположения, прежде чем сохранять его с mon goose. Кроме того, я бы изменил тип данных изображения в схеме mon goose на buffer
.
Что-то вроде этого должно работать (обратите внимание, что я использую async / await вместо обещаний напрямую):
router.post("/makepost", upload.single('profileimage'), async (req, res) => {
const newPost = new Post(req.body);
if (req.file) {
const imgBuffer = await fs.promises.readFile(req.file.path); // TODO add error handling
newPost.profileimage = imgBuffer;
}
try {
await myData.save();
res.redirect('/posts');
}catch(err) {
res.status(400).send("unable to save to database");
}
});
// mongoose schema
...
profileimage: Buffer,
...
Вы также можете сохранить изображение в виде строки в кодировке Base64 и сохранить в схеме тип данных string
.
РЕДАКТИРОВАТЬ:
Как обсуждалось в комментариях - измените тип данных profileimage обратно на string
, так как profileimage будет просто содержать путь к файлу.
router.post("/makepost", upload.single('profileimage'), async (req, res) => {
const newPost = new Post(req.body);
if (req.file) {
newPost.profileimage = req.file.path;
}
...
Добавьте промежуточное программное обеспечение express для обслуживания изображений, например,
app.use(express.static('./uploads'));