Nodejs: невозможно опубликовать изображение со строковыми полями в экспресс и мангусте

avatar
forest
1 июля 2021 в 17:32
34
0
0

Новое для 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));
});

Как видите, фото необязательно, так как мне добавить другие поля, если фото не требуется? Кроме того, я получил ошибку при попытке с почтальоном.

Источник
Đăng Khoa Đinh
1 июля 2021 в 18:39
0

Похоже, что req.file равно undefined. Как вы настроили запрос в Postman?

forest
1 июля 2021 в 19:02
0

Добавил картинку как form-data в тело, сделал запрос. Затем добавил другие поля как необработанные - JSON в тело и сделал запрос. Я попробовал эти два способа.

Đăng Khoa Đinh
1 июля 2021 в 19:12
0

Тип данных запроса может быть form-data или json. вы можете добавить строку как поле в данные формы.

Ilesh Patel
1 июля 2021 в 19:13
1

const photo = req.file.filename; измените эту строку на const photo = req.file && req.file.filename;

forest
1 июля 2021 в 19:28
0

@IleshPatel это сработало. Но разве req.file и req.file.filename не изображают одно и то же?

Ilesh Patel
2 июля 2021 в 05:10
1

когда вы пытаетесь использовать req.file.filename, а ваш req.file не определен, ваш код попытается получить доступ к имени файла из неопределенного. когда вы добавляете req.file && req.file.filename , вы убедитесь, что код получает доступ к имени файла только в том случае, если req.file не не определен.

Ответы (0)