无法使用 GridFsStorage 将文件上传到 mongodb

unable to upload files to mongodb with GridFsStorage

数据库连接文件

const mongoose = require('mongoose');
const multer = require('multer')
const {GridFsStorage} = require('multer-gridfs-storage')
const Grid = require('gridfs-stream');
const path = require('path');
const dotenv = require('dotenv');
const crypto = require('crypto')
dotenv.config( { path : 'config.env'} )
let storage;
exports.connectDB = ()=>{
    try{
        const con = mongoose.createConnection(process.env.MONGO_URL,{
            useNewUrlParser:true,
            useUnifiedTopology:true,

        })
        con.once('open', () => {
            // Init stream
           const gfs = Grid(con.db, mongoose.mongo);
            gfs.collection('uploads');
          });
        console.log(`MongoDB connected:${con}`)
    }catch(err){
        console.log(err);
        process.exit(1);
    }
} 

exports.createStorage = ()=>{
    storage = new GridFsStorage({
        url: process.env.MONGO_URL,
        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);
            });
          });
        }
      });
      console.log('storage created')
}
exports.upload = multer({storage})

post 上传作为中间件的请求

route.post('/example',database.upload.single('file'),async (req,res)=>{
    res.json({file:req.file})
})

当我用 postman 发出 post 请求时没有错误,但是文件没有上传 MongoDB 上传集合也没有被创建。

我正在从 index.js

调用 connectDB 和 createStorage
database.connectDB();
database.createStorage();

我解决了。问题是

exports.upload = multer({storage})

这行代码是在调用

之前执行的
database.createStorage();

所以解决方案是

exports.createStorage = ()=>{
  storage = new GridFsStorage({
    url:process.env.MONGO_URL,
    // db:conn.connection.db,
    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);
        });
      });
    }
  });
  exports.upload = multer({storage})
}