Проблема с асинхронной отправкой файлов на сервер PostgreSQL, NodeJS
Есть код, задача которого принимать в формдату 1 файл (видео), несколько файлов (фотографии) и несколько текстовых значений и пополнять 2 сущности в БД, следуя алгоритму, описанному ниже. Код работает лишь иногда, точной закономерности корректной отработки функции проследить не смог, девтулс выкидывает 404 с пометкой 'canceled'.
Алгоритм: форма передается в асинхронную функцию, где все файлы переименовываются и закидываются в папку со статикой, после этого пополняется БД PostgreSQL. Может стоить как-то проверять, все ли файлы готовы для отправки и выполнять пополнение БД только после того как все файлы загрузились ?
На фронте:
const addCar = () => {
const formData = new FormData()
formData.append('price', Number(price).toLocaleString('ru'))
formData.append('carNameId', Number(car.selectedCarName.id))
formData.append('year', `${year}`)
formData.append('motor', motor)
let date = new Date().toLocaleDateString()
formData.append('date', date)
formData.append('video', video)
formData.append('image', images[0])
Array.from(images).forEach(image => {
formData.append('images', image);
});
createCar(formData).then(() => setCarVisible(false))
}
функция createCar:
export const createCar = async (car) => {
const {data} = await $authHost.post('api/car', car)
return data
}
Роутер:
router.post('/' ,checkRole('ADMIN'),CarController.create)
Контроллер:
class CarController {
async create(req,res,next){
try{
let {price, carNameId, year, motor, date} = req.body
const {video, image, images} = req.files;
let videoName = uuid.v4() + '.mp4';
video.mv(path.resolve(__dirname,'..', 'static', videoName));
let imgName = uuid.v4() + '.jpg';
image.mv(path.resolve(__dirname,'..', 'static', imgName))
const car = await Car.create( {price,carNameId,year,motor,date,video: videoName,image: imgName})
if (images.length){
for (let i = 0; i<images.length;i++) {
imgName = uuid.v4() + '.jpg'
images[i].mv(path.resolve(__dirname,'..', 'static', imgName))
CarImages.create({
img: imgName,
carId: car.id
})
}
}
return res.json(car)
} catch (e){
next(ApiError.badRequest(e.message))
}
}
}
Сущности в PostgreSQL:
const Car = sequelize.define('car', {
id: {type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true},
price: {type: DataTypes.STRING, allowNull: false },
carNameId: {type: DataTypes.INTEGER, allowNull: false },
year: {type: DataTypes.INTEGER, allowNull: false},
motor: {type: DataTypes.STRING, allowNull: false },
date: {type: DataTypes.STRING, allowNull: false },
video: {type: DataTypes.STRING, allowNull: false },
image: {type: DataTypes.STRING, allowNull: false }
})
const CarImages = sequelize.define('car_images', {
id: {type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true},
img: {type: DataTypes.STRING, allowNull: false}
})
Car.hasMany(CarImages, {as: 'images'})
CarImages.belongsTo(Car)