简体   繁体   中英

TypeError: Cannot read properties of undefined (reading 'findOne') node js gridFS

I have gfs method to get images from mongoDB, the code was working fine when it was at main app.js but when I tried to move it to a folder it returns TypeError: Cannot read properties of undefined (reading 'findOne')

my images/mongoose model:

const mongoose = require('mongoose');
const mongoURI = process.env.MONGOURI;
const crypto = require("crypto");
const multer = require("multer");
const {GridFsStorage} = require("multer-gridfs-storage");
const Grid = require("gridfs-stream");
const path = require('path');


const conn = mongoose.createConnection(mongoURI);

//Init gfs
let gridfsBucket; 

let gfs = conn.once('open', () => {
  gridfsBucket = new mongoose.mongo.GridFSBucket(conn.db, {
  bucketName: 'uploads'
});

  gfs = Grid(conn.db, mongoose.mongo);
  gfs.collection('uploads');
  return gfs;
})



//create Storage engine
const storage = new GridFsStorage({
  limits: { fileSize: 5 * 1000 * 1000 },
  url: mongoURI,
  file: (req, file) => {
    return new Promise((resolve, reject) => {
      crypto.randomBytes(8, (err, buf) => {
        if (err) {
          return reject(err);
        }
        const filename = buf.toString('hex') + path.extname(file.originalname);
        const fileInfo = {
          filename: filename,
          bucketName: 'uploads'
        };
        resolve(fileInfo);
      });
    });
  }
});
const upload = multer({ storage });


module.exports = {
    upload,
    gridfsBucket,
    gfs,
    conn
}

My get image route:

const {gridfsBucket} = require('../models/mongoose');
const gfs = require('../models/mongoose');


  exports.getImg = (req, res) => {
    console.log(`req file name is: ${req.params.filename}`);
    gfs.files.findOne({filename: req.params.filename}, (err, file) => {

      //Check if file exist
      if(!file || file.length === 0) {
        return res.status(404).json({
          err: "No file exist"
        });
      } 
        // Check if image
      if(file.contentType === "image/jpeg" || file.contentType === "image/png" || file.contentType === "image/jpg" || file.contentType === "image/heic") {
        //Read output to client
        const readstream = gridfsBucket.openDownloadStreamByName(file.filename);
        readstream.pipe(res);
      } else {
        res.status(404).json({err: "Not an image"});
      }
    });
  };

The error:

TypeError: Cannot read properties of undefined (reading 'findOne')
    at exports.getImg (/Users/dordadon/Desktop/Full stack course/NerZikaron/controllers/system.js:136:15)
    at Layer.handle [as handle_request] (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/route.js:144:13)
    at Route.dispatch (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/route.js:114:3)
    at Layer.handle [as handle_request] (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/layer.js:95:5)
    at /Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/index.js:284:15
    at param (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/index.js:365:14)
    at param (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/index.js:376:14)
    at Function.process_params (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/index.js:421:3)
    at next (/Users/dordadon/Desktop/Full stack course/NerZikaron/node_modules/express/lib/router/index.js:280:10)```

According to the syntax, gfs is not what you expect. you are trying to access gfs within the module. Try it with:

const {gfs} = require('../models/mongoose');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM