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

时间:2018-08-03 17:43:58

标签: javascript node.js mongodb file-upload gridfs

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

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 });

然后对于post API,我还没有足够的代码来更新另一个mongoDB文档,并引用了有效的文件

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

//All the code to update
}

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

1 个答案:

答案 0 :(得分: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}
      };
    },
  });

如您所见,使用元数据会将其作为文件:部分中返回的对象的属性来返回。

Mongo Compass entry for added file

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

希望这会有所帮助