Kawan
Kawan

Reputation: 15

How can I fix Multer Gridfs Storage error "Error creating storage engine. At least one of url or db option must be provided"?

I am trying to make the functionality of uploading images to MongoDB using GridFS. I am getting the error please have a look

Complete Error:

[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
K:\Development\MindFuel\Backend\node_modules\multer-gridfs-storage\lib\gridfs.js:71
            throw new Error('Error creating storage engine. At least one of url or db option must be provided.');
            ^

Error: Error creating storage engine. At least one of url or db option must be provided.
    at new GridFsStorage (K:\Development\MindFuel\Backend\node_modules\multer-gridfs-storage\lib\gridfs.js:71:19)
    at Object.<anonymous> (K:\Development\MindFuel\Backend\Helpers\Libraries\imageUpload.js:9:18)      
    at Module._compile (node:internal/modules/cjs/loader:1376:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
    at Module.load (node:internal/modules/cjs/loader:1207:32)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at Module.require (node:internal/modules/cjs/loader:1235:19)
    at require (node:internal/modules/helpers:176:18)
    at Object.<anonymous> (K:\Development\MindFuel\Backend\Routers\story.js:2:21)
    at Module._compile (node:internal/modules/cjs/loader:1376:14)

Node.js v20.11.1
[nodemon] app crashed - waiting for file changes before starting...

Connect Database file

const Grid = require("gridfs-stream");
    const mongoose = require("mongoose");

    const connectDatabase = async () => {    

    const conn = await mongoose.createConnection(process.env.MONGO_URI, { useNewUrlParser: true });
    let gfs;
    
    conn.once('open', ()=>{
        // Init stream
        gfs = Grid(conn.db, mongoose.mongo);
        gfs.collection('images');
    })
    console.log("Connected database successfully");
}
   module.exports = connectDatabase;

Here is my image Upload file in NodeJS

const CustomError = require("../error/CustomError")
const crypto = require('crypto');
const multer = require("multer")
const { GridFsStorage } = require("multer-gridfs-storage")
const path = require("path")

// create storage engine

const storage = new GridFsStorage({
    url: process.env.MONGO_URI,
    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: "images"
          };
          resolve(fileInfo);
        });
      });
    }
  });

const fileFilter = (req, file, cb) => {

    allowedMimeTypes = ["image/jpeg", "image/jpg", "image/png", "image/gif"]

    if (!allowedMimeTypes.includes(file.mimetype)) {
        return (new CustomError("Please provide a valid image file ", 400), null)
    }

    cb(null, true);

}

const imageUpload = multer({ storage, fileFilter })


module.exports = imageUpload; 

My process.env.MONGO_URI variable is in the form: URI=mongodb+srv://...

Any help is greatly appreciated :)

Upvotes: 0

Views: 87

Answers (1)

O Halabi
O Halabi

Reputation: 11

The process.env.MONGO_URI wil be undefined. If you are using dotenv just added to your Upload file like this

require('dotenv').config()

You should be fine to go

Upvotes: 0

Related Questions