1

I am trying to follow along a tutorial and use nodejs with 'gridfs-stream' along with a react front end. The tutorial is from last year in 2020.

Here is my code.

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const cors = require('cors')
const multer = require('multer');
const {GridFsStorage} = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
const path = require('path');
const Pusher = require('pusher')

const mongoPosts = require ('./mongoPosts.js')
// const currentTournamentControllers = require('../controllers/currenttournament-controllers');



const app = express();
const port = process.env.PORT || 9000


app.use(bodyParser.json())
app.use(cors())

const mongoURI = 'mongodb+srv://fbclient:rmbmbkvZVHw3e6OK@cluster0.emaw1.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'

const conn = mongoose.createConnection(mongoURI);
mongoose.connect(mongoURI)
mongoose.connection.once('open', () => {
    console.log('DB Connected')
})

let gfs

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

  const storage = new GridFsStorage({
    url: mongoURI,
    file: (req, file) => {
        return new Promise((resolve, reject) => {{
            const filename = `image-${Date.now()}${path.extname(file.originalname)}`   
            const fileInfo = {
                filename: filename,
                bucketName: 'images'
            }
            resolve (fileInfo)
        }})
    }
})

const upload = multer({storage})

app.get('/', (req, res) => res.status(200).send('hello world'))

app.post('/upload/image', upload.single('file'), (req, res) => {
    res.status(201).send(req.file)
})

app.post('/upload/post', (req, res) => {
    const dbPost = req.body
    console.log(dbPost)
    mongoPosts.create(dbPost, (err, data) => {
        if(err){
            res.status(500).send(err)
        } else {
            res.status(201).send(data)
        }
    })
})

app.get('/retrieve/image/single', (req, res) => {
    console.log(req.query.name)
    gfs.files.findOne({filename: req.query.name}, (err, file) => {
        if(err) {
            res.status(500).send(err)
        } else {
            console.log(file)
            if(!file || file.length === 0) {
                console.log("hi i errored out")
                res.status(404).json({err: 'file not found'})
            } else {
                console.log("hi i am trying to read")
                const readstream = gfs.createReadStream(file.filename)
                readstream.pipe(res)
            }
        }
    })
})

app.get('/retrieve/posts', (req, res) => {
    mongoPosts.find((err, data) => {
        if(err){
            res.status(500).send(err)
        } else {
            data.sort((b,a) => {
                return a.timestamp - b.timestamp
            })
            res.status(200).send(data)
        }
    })
})



app.listen(port, () => console.log(`listening on localhost:${port}`))   

The problem is with readstream. When I am trying to retrieve the data it shows the error TypeError: grid.mongo.ObjectID is not a constructor

I did some debugging and figured out that this can be fixed by changing a value inside the gridfs.js file in the node_modules. The change being suggested on Stack Overflow was this :-

this._store = new grid.mongo.GridStore(grid.db, this.id || new grid.mongo.ObjectID(), this.name, this.mode, options);

changed to

this._store = new grid.mongo.GridStore(grid.db, this.id || new grid.mongo.ObjectId(), this.name, this.mode, options);

The suggestion was to change the grid.mongo.ObjectID value to grid.mongo.ObjectId. So I did that. Now the error coming out is as follows:-

TypeError: grid.mongo.GridStore is not a constructor

For this I am not getting any fixes on stack overflow or any other websites. Can someone please help

Sandy
  • 127
  • 1
  • 12
  • Did you install same `version` of packages with that tutorial? maybe there is an incompatible version. – Amin Taghikhani Sep 28 '21 at 04:32
  • 1
    it was the mongoose version. I had the latest version 6.0.7 and apparently 'gridfs-stream' works only with version 5.13.7. Dont know what the long term resolution for this is. for now I just changed the version and it seems to be working fine. Thanks for the clue man. – Sandy Sep 28 '21 at 05:59

0 Answers0