Reputation: 1
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)```
Upvotes: 0
Views: 293
Reputation: 96
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');
Upvotes: 0