繁体   English   中英

如何将选项传递到导入的模块中?

[英]How can I pass options into an imported module?

我有一个实用程序模块,该模块创建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而我倾向于当前的实现方式,不允许这样做。

我对节点了解不多,现在已经知道什么是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

我知道这并不能按照您想要的方式回答您的问题,但是可以回答您的问题标题,我希望这可以使您更好地了解如何做自己想做的事情。

如果这样做没有帮助,请告诉我。

您需要将参数传递给模块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)

换句话说,当您在模块内部公开gfsuploadEngine ,可以公开一个函数,该函数将接收执行上传所需的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM