devconcept / multer-gridfs-storage

🍃 GridFS storage engine for Multer to store uploaded files directly to MongoDb
MIT License
235 stars 67 forks source link

unable to upload files #464

Closed abhijeet-arya closed 2 years ago

abhijeet-arya commented 2 years ago

database connection file

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 = async ()=>{
    try{
        mongoose.connect(process.env.MONGO_URL,{
            useNewUrlParser:true,
            useUnifiedTopology:true,

        }).then(
          (promise)=>{
            console.log(`Mongodb connected:${promise.connection.host}`)
            // console.log(`MongoDb connected:${promise.connection.db}`)
            const gfs = Grid(promise.connection.db, mongoose.mongo);
            gfs.collection('uploads');

            storage = new GridFsStorage({
              url:process.env.MONGO_URL,
              db:promise,
              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)
          },
          (err)=>{
            console.log(err)
          }
        )
    }catch(err){
        console.log(err);
        process.exit(1);
    }
} 
exports.upload = multer({storage})

post request with upload as middleware

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

when I do a post request with postman there's no error but file doesn't upload on MongoDB neither the upload collection is being created.

and output of console.log(storage)

GridFsStorage {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: 0,
  db: Db {
    s: {
      client: [MongoClient],
      options: [Object],
      logger: [Logger],
      readPreference: [ReadPreference],
      bsonOptions: [Object],
      pkFactory: [Object],
      readConcern: undefined,
      writeConcern: [WriteConcern],
      namespace: [MongoDBNamespace]
    }
  },
  client: null,
  connected: true,
  connecting: false,
  caching: false,
  error: null,
  configuration: {
    url: 'my_mongodb_url(removed original one)',
    db: <ref *1> Mongoose {
      connections: [Array],
      models: [Object],
      events: [EventEmitter],
      options: [Object],
      _pluralize: [Function: pluralize],
      Schema: [Function],
      model: [Function (anonymous)],
      plugins: [Array],
      default: [Circular *1],
      mongoose: [Circular *1]
    },
    file: [Function: file]
  },
  _file: [Function: file],
  _options: undefined,
  [Symbol(kCapture)]: false
}
abhijeet-arya commented 2 years ago

in postman response it just show the original file as it is. nothing like chunk-size, filename, bucketName etc.

abhijeet-arya commented 2 years ago

I resolved it. the problem was

exports.upload = multer({storage})

this line of was getting executed before the storage variable initialisation, since storage is inside of promise of mongoose.connect()