MongoDB искажает двоичные данные! (express.js , малтер)

#node.js #mongodb #express #multer

Вопрос:

Что я пытаюсь сделать?: Итак, в основном я буду загружать zip-файл, и он будет сохранен в MongoDB, а затем пользователи смогут открыть магазин и загрузить эти файлы!

Шаги:

  1. Во-первых, я загружаю файл с помощью Multer в express.js!
 const upload = multer({
    storage: multer.memoryStorage()
}).fields([
    { name: 'fileupload'},
    { name: 'logo' },
    { name: 'screenshots' }
])
 

Поэтому я сохраняю файлы в памяти, а затем добавляю их в базу данных. Это включает в себя:- (а) массив изображений, (б) Один файл изображения (в) файл .zip (вот в чем проблема!)

  1. Хранение его в базе данных:-
 return await mongo().then(async (mongoose) => {
        try {
            const result = await new pluginSchema({
                name ,
                desc ,
                price ,
                category ,
                file ,
                logo ,
                images ,
                reviews,
                coupon
            }).save()

            pluginCache[result._id] = result // Caching the file (IMPORTANT)
            return result
        } finally {
            mongoose.connection.close()
        }
    })
 

После добавления я сохраняю плагин (zip-файл) в переменную кэша. И я буду использовать эту переменную для получения «результата» вместо многократной выборки из базы данных!

Проблема: Хорошо, теперь , как только я попытаюсь перейти на страницу продукта и нажать «Загрузить», начнется загрузка файла. На этот раз плагин извлекается из переменной кэша, т. е. возвращается кэшированный результат, который загружается. Вот как я его загружаю,

 res.set({
            "Content-Type": plugin.file.mimetype,
            "Content-Disposition": `attachment; filename=${plugin.file.originalname}`
        })
        res.send(plugin.file.buffer)
 

И файл загружается совершенно нормально, и ничего не повреждено!

но!

Когда я перезапускаю сервер, все переменные очищаются, а переменная кэша очищается, так что теперь плагин извлекается из базы данных. И как только он извлекается из базы данных и когда я загружаю этот файл, я получаю поврежденный zip-файл .

Важная Вещь: Консоль.регистрация файлов req. (multer хранит файлы здесь):-

 {
  fieldname: 'fileupload',
  originalname: 'example.jar',
  encoding: '7bit',
  mimetype: 'application/x-zip-compressed',
  buffer: <Buffer >, // CMD Doesn't display entire buffer data, but I have checked and this exists!
  size: 0
}
 

И данные сохраняются в MongoDB таким образом,
[MongoDB][1]

И всякий раз, когда я извлекаю файлы непосредственно из MongoDB, файлы повреждаются, но когда я загружаю файлы, кэширую их и использую кэшированные переменные, все работает нормально! [1]: https://i.stack.imgur.com/PEPpt.png

Некоторые вещи, которые, по-моему, не имеют значения: загрузка поврежденного файла(извлечение и загрузка с MongoDB) приводит к увеличению размера файла до 14 КБ(вместо 11 КБ), и этот zip-файл не может быть распакован! Кроме того, изображения сохраняются в полном порядке, но почему файл .zip поврежден!

Комментарии:

1. Я нашел обходной путь для этого, создав папку, поместив в нее все файлы, а затем заархивировав папку и загрузив ее.