Новое для Express и Mongoose. Я использую mutler
для загрузки изображения с запросом post
вместе с некоторыми другими данными String
и Number
. Когда я загружаю только изображение с почтальоном, оно появляется в указанном месте, но когда я отправляю строки, оно показывает следующее:
TypeError: Cannot read property 'filename' of undefined
На данный момент я упомянул фотографию как необязательную. Это моя схема:
const menuItemSchema = new mongoose.Schema({
name: {type: String, required: true, unique: true},
price: Number,
category: {
type: String,
enum: ['veg', 'non-veg']
},
weight: Number,
photo: {type: String, required: false},
ingredients: [String]
});
const MenuItem = mongoose.model('MenuItem', menuItemSchema);
А это маршрут. Я определил свойства mutler в этом файле маршрута:
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'images/menuItem')
},
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
cb(null, file.fieldname + '-' + uniqueSuffix + '.jpg')
}
});
const fileFilter = (req, file, cb) => {
const allowedFileTypes = ['image/jpeg', 'image/jpg', 'image/png'];
if(allowedFileTypes.includes(file.mimetype)) {
cb(null, true);
} else {:
cb(null, false);
}
}
const upload = multer({ storage, fileFilter })
router.post('/', upload.single('photo'),(req, res, next) => {
const photo = req.file.filename;
const name = req.body.name;
const price = req.body.price;
const category = req.body.category;
const weight = req.body.weight;
const ingredients = req.body.ingredients
const newMenuItemData = {name, price, category, weight, ingredients, photo}
const newMenuItem = new MenuItem(newMenuItemData);
newMenuItem.save()
.then(menuItem => res.json({'message': 'Item added!'}))
.catch(err => res.status(400).json('Error: ' + err));
});
Как видите, фото необязательно, так как мне добавить другие поля, если фото не требуется? Кроме того, я получил ошибку при попытке с почтальоном.
Похоже, что
req.file
равноundefined
. Как вы настроили запрос в Postman?Добавил картинку как
form-data
в тело, сделал запрос. Затем добавил другие поля как необработанные - JSON в тело и сделал запрос. Я попробовал эти два способа.Тип данных запроса может быть
form-data
илиjson
. вы можете добавить строку как поле в данные формы.const photo = req.file.filename; измените эту строку на const photo = req.file && req.file.filename;
@IleshPatel это сработало. Но разве
req.file
иreq.file.filename
не изображают одно и то же?когда вы пытаетесь использовать req.file.filename, а ваш req.file не определен, ваш код попытается получить доступ к имени файла из неопределенного. когда вы добавляете req.file && req.file.filename , вы убедитесь, что код получает доступ к имени файла только в том случае, если req.file не не определен.