Доброй ночи, пытаюсь разобраться с проблемами.
Есть такой код в multer/uploadImage.js
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'images/');
},
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
const fileExtension = file.originalname.split('.').pop();
const newFilename = `${uniqueSuffix}.${fileExtension}`;
cb(null, newFilename);
}
});
const fileFilter = (req, file, cb) => {
if (
file.mimetype === "image/jpeg" ||
file.mimetype === "image/png" ||
file.mimetype === "image/gif" ||
file.mimetype === "image/svg+xml" ||
file.mimetype === "audio/mpeg" ||
file.mimetype === "audio/wav" ||
file.mimetype === "audio/ogg" ||
file.mimetype === "video/mp4" ||
file.mimetype === "video/quicktime" ||
file.mimetype === "video/x-msvideo" ||
file.mimetype === "video/x-flv"
) {
cb(null, true);
} else {
cb(null, false);
}
}
const upload = multer({
storage,
fileFilter
});
const uploadImage = (file) => {
return new Promise((resolve, reject) => {
upload.single('image')(file, {}, function (err) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
module.exports = uploadImage;
В роутере я прописал так:
router.post('/movies/create', uploadImage, MovieController.create);
Код в MovieController такой:
const upload = require('../multer/UploadImage');
const APIError = require('../exceptions/APIError');
const {validationResult} = require('express-validator');
const MovieService = require('../services/MovieService');
class MovieController {
async create(req, res, next) {
try {
const {title, imageURL, link, info} = req.body;
if (!title || !imageURL || !link || !info.text) {
return next(APIError.BadRequest("Вы не заполнили все поля"));
}
await MovieService.create()
} catch (e) {
next(e);
}
}
}
module.exports = new MovieController();
Код в сервисе такой:
const Movie = require('../models/Movie');
const APIError = require('../exceptions/APIError')
class MovieService {
async get(title = "") {
const data = Movie.find({
title
});
return data;
}
async create(title, coverURL, link, info) {
const find = Movie.findOne(link);
if (!find) {
throw APIError.BadRequest('Ссылка уже использована');
}
try {
await Movie.create({
title,
coverURL,
link,
info
});
} catch (e) {
throw APIError.InternalError("Произошла ошибка при создании фильма!");
}
return "Фильм успешно создан!";
}
}
module.exports = new MovieService;
Модель у меня такая:
const mongoose = require('mongoose');
const { Schema, model } = mongoose;
const Movie = new Schema({
title: {type: String,
required: true
},
coverURL: {
type: String,
required: true
},
link: {
type: String,
required: true
},
info: {
images: [
{
type: String
}
],
videos: [
{
type: String
}
],
text: {
type: String,
required: true
}
}
});
module.exports = model("Movie", Movie);
Проблемы:
Во-первых, я не могу понять, как мне сформировывать ссылки на изображения/файлы/аудио/итп и сохранять в БД, если я вызываю uploadImage(а иных способов в инете я не нашел) из роутера.
Во-вторых, я не могу понять, как разделить загрузку изображений? По модели ясно, что у нас будет одно изображение, массив изображений и массив видео. Как это все разделять?
В-третьих, если у меня пойдет что-то не так, например при валидации, то как мне удалить изображение на сервере? Если я этого не буду делать, то допустим создание записи в БД будет не успешным, а изображение или видео останется на сервере. Это будет сильно захламлять сервер и это необходимо предусмотреть.
Прошу прояснить данные вещи! Заранее благодарю!