#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 и изображение, но возникает ошибка проверки