Как я могу передать параметры в импортированный модуль? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть служебный модуль, который создает экземпляр механизма хранения 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, и я склоняюсь к своей текущей реализации, не допуская этого.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Вам нужно передать параметр в модуль gridFs_upload_engine.js и сделать там магию.

Примером может быть:

В gridFs_upload_engine.js файле:

function uploadEngine (id, file) {
  // update what you want
}

module.exports = {
  ...
  uploadEngine: uploadEngine
}

В вашем роутере:

const upload = require('../../utils/gridFs_upload_engine')
...

router.post('/single/:id', function(req, res, next) {
  ...
  upload.uploadEngine(req.params.id, file)
  next()

}, upload_controller.upload_single_file)

Другими словами, когда вы выставляете gfs и uploadEngine внутри вашего модуля, вы можете вместо этого выставить функцию, которая получит аргументы, необходимые для выполнения загрузки.

1 голос
/ 10 апреля 2019

Я не знаю много об узле и теперь знаю, что такое multer-gridfs, но я могу ответить How can I pass options into an imported module?

Вы можете экспортировать функцию, которая возвращает другую функцию.И вы импортируете его как

const configFunction = require('nameoffile')
// this returns a functions with the config you want
const doSomethingDependingOnTheConfig = configFunction({...someConfig}) 

И в импортируемом вами файле будет функция, возвращающая другую функцию, такую ​​как

const configFunction = ({...someConfig}) => (your, func) => {

    // do what you want deppending on the config

}

module.exports = configFunction

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

Если это не поможет, просто дайте мне знать.

...