У меня есть служебный модуль, который создает экземпляр механизма хранения multer-gridfs
для загрузки файлов в мою базу данных Mongo.Я использую этот модуль внутри любого API-маршрута, который требует загрузки файлов.
Мне нужно обновить значение свойства metadata
с помощью уникального идентификатора.Скорее всего, это будет мангуст _id
пользователя, загружающего файл, но сейчас я не обеспокоен этим аспектом.Я действительно просто хочу знать, смогу ли я динамически изменить свойство metadata
.
Вот механизм хранения gridFs_upload_engine.js
:
const mongoose = require('mongoose');
const path = require('path');
const crypto = require('crypto');
const multer = require('multer');
const GridFsStorage = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
//Init Upload Engine
let gfs;
//Global instance of the DB connection
const database = mongoose.connection;
const mongoDb = process.env.MONGODB_URI || process.env.MLAB_URL;
database.once('open', () => {
//Init Stream
gfs = Grid(database.db, mongoose.mongo);
gfs.collection('uploads');
});
//Create Storage Engine
const storage = new GridFsStorage({
url: mongoDb,
file: (res, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString('hex') + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'uploads',
metadata: 'NEED TO UPDATE THIS'
};
resolve(fileInfo);
});
});
}
});
const uploadEngine = multer({ storage });
module.exports = {
uploadEngine,
gfs
};
Выше вы можете видеть свойство metadata
, которое мне нужно иметь возможность динамически изменять с некоторым неопределенным уникальным идентификатором.Возможно ли это сделать с экспортированным файлом?
Вот как я использую его внутри маршрута API:
const express = require('express');
const router = express.Router();
//Controllers
const upload_controller = require('../../controllers/uploader');
//Utilities
const upload = require('../../utils/gridFs_upload_engine');
const { uploadEngine } = upload;
//Upload Single File
router.post(
'/single',
uploadEngine.single('file'),
upload_controller.upload_single_file
);
//Upload Multiple Files
//Max file uploads at once set to 30
router.post(
'/multiple',
uploadEngine.array('file', 30),
upload_controller.upload_multiple_files
);
module.exports = router;
Я передаю uploadEngine
в маршрут API здесь, так что контроллер маршрута может использовать его, и это работает без проблем.Я просто довольно долго пытаюсь понять, как динамически обновлять metatdata
, и я склоняюсь к своей текущей реализации, не допуская этого.