Отправить изображение из данных формы и данных JSON от postman для узла js

#node.js #request #postman #multer

#node.js #запрос #postman #мультер

Вопрос:

Проблема

Как я получил изображение и данные JSON от postman в API узла js? Когда я отправляю изображение из form-data, а также отправляю данные JSON, получен только один. Если изображение отображается в запросе, то данные JSON не получены и произошла ошибка проверки.

Как я справляюсь с этим случаем? Создайте отдельный API для загрузки изображений. Каков наилучший способ сделать это

account.js

 const express = require('express');
const multer = require('multer');
const { constants } = require('../helpers/contants');
const { commonValidation } = require('../validation/commonValidation');

const { validation } = require('../middleware/validation');
const crypto = require("crypto");

const {
updateProfile,

} = require('../controllers/account');


 
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, `public/${constants.imageDir}`)
},
filename: async (req, file, callback) => {
var filetype = '';
  if(file.mimetype === 'image/jpg') {
    filetype = 'gif';
  }
  if(file.mimetype === 'image/png') {
    filetype = 'png';
  }
  if(file.mimetype === 'image/jpeg') {
    filetype = 'jpg';
  }
  callback(null, 'image-'   crypto.randomBytes(3).toString('hex')   '-'   
  Date.now()   '.'   filetype);
  
 }

 })
 var upload = multer({ storage: storage,fileFilter: (req, file, callback) => {
 if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || 
 file.mimetype == "image/jpeg") {
 callback(null, true);
 } else {
  callback(null, false);
 return callback(new Error('Only .png, .jpg and .jpeg format allowed!'));
 }
 } });



 const router = express.Router({ mergeParams: true });

 router.use(upload.single('image'));
 router.use((req, res, next) => {
  if (!Array.isArray(req.image)) {
  req.image = []
 } 
  req.body = req.body.request 
  if (req.file) {
   //set the avatar in req to get the image name in updateProfile controller
  req.body.avatar = req.file.filename;
  req.image.push(req.file.filename)
  }

  return next()
  })
  router
  .patch('/', [commonValidation('updateProfile')], validation, updateProfile)


   module.exports = router;
  

Общая проверка

  exports.commonValidation = (method) => {
 switch (method) {

 case 'updateProfile': {
 return [
    check('name', 'Name is required').not().isEmpty().trim().escape(),
    
  ]
}
}
  

проверка

 const { validationResult } = require('express-validator');


module.exports.validation = (req, res, next) => {
const errors = validationResult(req)
if (errors.isEmpty()) {
return next() 
}
// err.message = 'ValidationError';

const extractedErrors = []
errors.array({ onlyFirstError: true }).map((err) => extractedErrors.push({ 
[err.param]: err.msg }))
next(extractedErrors);

}
  

Учетная запись

   exports.updateProfile = asyncHandler(async (req, res, next) => {




 if(typeof req.body.avatar !== 'undefined'){
 const oldImage = await User.findById(req.user._id);

 //oldImage.avatar exist then delete the previous image from directory
 if(oldImage.avatar){

  deleteImageFromFolder('images',oldImage.avatar)
 
  }
  }
 const user = await User.findByIdAndUpdate(req.user._id, req.body, {
 new: true,
 runValidators: true
 });

 const profile = user.getProfile();


 res.status(200).json({
   success: true,
   data: profile
   });
   });
  

postman

На этом изображении ниже получены данные JSON и изображение, но возникает ошибка проверки

Отладчик

Я также использовал этот подход, но все равно получил ошибку проверки

Заголовки Postman