Javascript 如何将选项传递到导入的模块中?
我有一个实用模块,它创建了一个Javascript 如何将选项传递到导入的模块中?,javascript,node.js,es6-modules,Javascript,Node.js,Es6 Modules,我有一个实用模块,它创建了一个multer-gridfs存储引擎的实例,用于将文件上载到我的Mongo数据库。我在需要上传文件的任何API路由中使用此模块 我需要能够使用唯一标识符更新元数据属性值。这很可能是上传文件的用户的mongoose\u id,但目前我并不关心这方面的问题。我真的只是想知道我是否可以动态更改元数据属性 这是存储引擎gridFs\u upload\u engine.js: const mongoose = require('mongoose'); const path =
multer-gridfs
存储引擎的实例,用于将文件上载到我的Mongo数据库。我在需要上传文件的任何API路由中使用此模块
我需要能够使用唯一标识符更新元数据
属性值。这很可能是上传文件的用户的mongoose\u id
,但目前我并不关心这方面的问题。我真的只是想知道我是否可以动态更改元数据
属性
这是存储引擎gridFs\u upload\u 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
};
上面您可以看到元数据
属性,我需要能够使用一些未确定的唯一标识符动态更改该属性。是否可以使用导出的文件执行此操作
以下是我如何在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
,我倾向于我当前的实现不允许这样做 我对node了解不多,现在知道了什么是multer-gridfs
,但我可以回答如何将选项传递到导入的模块?
可以导出返回另一个函数的函数。你会像这样导入它
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\u upload\u engine.js
,然后在那里执行魔术
例如:
在gridFs\u upload\u 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
时,您可以公开一个函数,该函数将接收执行上载所需的参数。元数据从何而来?元数据是multer gridfs storage提供的属性。可以在这里找到该节点包文档:默认情况下,它设置为null。它保留用于将可能有用的任何其他数据附加到文件名。在我的特定情况下,metadata属性将用于存储上传文件的用户的mongoose\u id。谢谢,我将使用此属性,看看是否可以让它为我工作。谢谢你!非常感谢。我也会试试这个。