@Nikita1244
Anonymous

Как реализовать формирование ссылок в multer?

Доброй ночи, пытаюсь разобраться с проблемами.
Есть такой код в 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(а иных способов в инете я не нашел) из роутера.
Во-вторых, я не могу понять, как разделить загрузку изображений? По модели ясно, что у нас будет одно изображение, массив изображений и массив видео. Как это все разделять?
В-третьих, если у меня пойдет что-то не так, например при валидации, то как мне удалить изображение на сервере? Если я этого не буду делать, то допустим создание записи в БД будет не успешным, а изображение или видео останется на сервере. Это будет сильно захламлять сервер и это необходимо предусмотреть.

Прошу прояснить данные вещи! Заранее благодарю!
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы