gpt4 book ai didi

javascript - 通过 request.body 将元数据添加到 GridFS 文件

转载 作者:行者123 更新时间:2023-12-02 23:49:57 25 4
gpt4 key购买 nike

我在尝试动态更新导出的 Multer GridFS 模块中的元数据属性时遇到了一些困难。该模块包含一个“上传引擎”,用于处理将文件上传到我的数据库。这是 multer-gridfs-storage 库。

这是我的 GridFs 上传模块 gridFs_upload_engine.js:

> //Upload Engine 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; 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: (req, 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: 'Add Metadata here'
> };
> resolve(fileInfo);
> });
> }); } });
>
> const uploadEngine = multer({ storage });
>
> module.exports = { engine: uploadEngine, gfs };

上面的metadata属性是我需要更改的。这个 fileinfo 对象在上传时由 GridFs 添加到每个文件中。 req 参数是我认为可以访问调用此中间件的路由的 req.body 的地方,但它返回为 undefined

这是我的测试路线:

const express = require('express');
const router = express.Router();

//Controllers
const upload_controller = require('../../controllers/uploader');

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

const { engine } = upload;
//Upload Single File
router.post(
'/single',
engine.single('file'),
upload_controller.upload_single_file
);

这里是我将 GridFs 中间件传递到 API 路由中的位置。这让 Controller 可以利用它。

这是我的上传 Controller :

exports.upload_single_file = (req, res, next) => {
console.log({ file: req.file });
res.redirect('/');
};

console.log 按预期记录了使用 GridFs 上传引擎上传的文件的信息。

我知道我需要以某种方式将参数传递给gridFs_upload_engine.js。由于该文件是导出的模块,因此我不完全确定如何完成此操作。我可以将此代码直接放入我的 API Controller 中并以这种方式进行操作,但我希望它成为一个可以从其他 Controller 调用的模块。

最佳答案

我最终通过公开一个函数来解决这个问题,该函数允许我更新变量,然后将其用作元数据值。

API 路由:

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

const { engine, updateMetadata } = upload;

//Upload Single File
router.post(
'/single',
(req, res, next) => {
updateMetadata('xxxxxx'); //Static test value
next();
},
engine.single('file'),
upload_controller.upload_single_file
);

在这里,我添加了一个回调,其中包含上传引擎公开的 updateMetadata() 函数。在这里,我使用公开的 updateMetadata() 函数设置元数据。然后,通过使用 next()router 移动到 engine.single('file'),这才是实际处理文件上传的地方。

这是 GridFs 上传引擎:

//Create Storage Engine
let updatedMetadata;

const updateMetadata = id => {
updatedMetadata = id;
};

const storage = new GridFsStorage({
url: mongoDb,
file: (req, 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: updatedMetadata ? updatedMetadata : null
};
resolve(fileInfo);
});
});
}
});

const uploadEngine = multer({ storage });

module.exports = {
engine: uploadEngine,
updateMetadata,
gfs
};

我不确定这是否是最好的方法,但它工作正常并且符合预期,所以我不会再质疑它。希望这对某人有帮助!

关于javascript - 通过 request.body 将元数据添加到 GridFS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55693758/

25 4 0
文章推荐: javascript - 如何使用reducer将对象添加到数组中
文章推荐: angularjs - 在标题模板 angularjs 中显示隐藏菜单
文章推荐: angularjs - 将一个指令替换为另一个指令,而无需编译子节点两次
文章推荐: javascript - 如何使
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com