通过API中的req.query将元数据信息附加到Gridfs文档文件 - Node.js Expresss.js MongoDB Multer Gridfs流

问题描述 投票:2回答:1

在将实际存储在mongoDB中之前,我很难将元数据信息附加到文件中。我正在使用:

const express = require("express");
const router = express.Router();
//File managing with gridfs
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');
const fs = require('fs');

作为库,然后是商店引擎:

const conn = mongoose.createConnection(mongoURI);
//TODO : test the api for the files
let gfs;

conn.once('open', () => {
  // Init stream
  gfs = Grid(conn.db, mongoose.mongo);
  gfs.collection('uploads');
});

// Create storage engine
const storage = new GridFsStorage({
    url: mongoURI,
    gfs:gfs,
    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'
            };
            resolve(fileInfo);
          });
        });
    },
    metadata: (req, file, cb) => {
        const metadata = {
            originalname: file.originalname,
            // get this information somehow
            restaurantID :req.query.restaurantID,
            category : req.query.category
        };
        cb(null, metadata);
    }
});
const upload = multer({ storage: storage });

然后对于后API我没有那么多但只是一个代码更新另一个mongoDB文档与引用的文件

router.post('/upload', upload.single("file"), (req, res) => {

//All the code to update
}

我需要的是一种存储在req.query中传递的信息的方法,并将其放入gridFS文件集合的元数据中,以便进行一些查询以便在将来找到正确的文件,然后将其保存为obviusoly。这适用于我使用此API上传的每个文件。感谢你们。

javascript node.js mongodb file-upload gridfs
1个回答
0
投票

我正在使用此代码将一些信息添加到fs.files集合的元数据中。

state.storage = multerGridfs({
    url: mongoServerUrl,
    db: db.connection,
    file: (req, file) => {
      logger.info(`Uploading file: ${file.originalname} for account ${req.params.accountId}`);
      return {
        filename: file.originalname,
        metadata: { accountId: req.params.accountId}
      };
    },
  });

正如您所看到的那样,您可以使用元数据将其作为您在file:section中返回的对象的属性返回。

Mongo Compass entry for added file

这里有一些很好的例子https://www.npmjs.com/package/multer-gridfs-storage的链接。

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.