why cant i delete gfs.files with an ObjectId? why cant i delete gfs.files with an ObjectId? mongoose mongoose

why cant i delete gfs.files with an ObjectId?


i was doing the cast wrong, and using the wrong methods.After using a new constructor for mongodb.ObjectID() instead of mongodb.ObjectiD(), i had some success, plus i was calling on a few of the wrong methods. I consulted the documentation and straightened things out.

My final code for CRUD operations is:

/** * Created by foolishklown on 10/13/2016. */var assert = require('assert'),    path = require('path'),    Grid = require('gridfs-stream'),    fs = require('fs'),    mongodb = require('mongodb'),    mongoose = require('mongoose'),    User = require('../../models/user'),    mediaUri = 'mongodb://localhost/media',    userUri = 'mongodb://localhost/mean-auth';module.exports = {    writeFile: function (file, userId, fileType, fileInfo, res) {        var fileId;        var fileTitle = file.originalFilename;        var conn = mongoose.createConnection('mongodb://localhost/media', (error) => {            if (error) {                console.error('Error connecting to mongod media instance'.red);                process.exit(1);            } else {                console.info('Connected successfully to mongod media instance in the write file!'.blue);            }        });        // The following line is designating a file to grab/read, and save into mongo        //  in our case it will be something from ng-file-upload that the user wants to upload        var myFile = file.path;        // Connect gridFs and mongo        Grid.mongo = mongoose.mongo;        conn.once('open', function () {            console.log('connection open, ready for I/O!');            var gfs = Grid(conn.db);            // This write stream is how well write to mongo            var writeStream = gfs.createWriteStream({                // Name the file the way you want it stored in mongo                filename: file.originalFilename,                type: fileType,                info: fileInfo            });            // Create a read stream, so that we can read its data, and then with that well use the            //  write stream to write to the DB via piping the writestream            var readStream = fs.createReadStream(myFile)                .on('end', () => {                    writeToUserDb(userId, fileType, readStream.id, fileInfo, fileTitle);                    res.status(200).send(                        {                            ref: readStream.id,                            type: fileType,                            user: userId,                            mediaInfo: fileInfo,                            title: fileTitle                        }                    );                })                .on('error', () => {                    res.status(500).send('error in writing with gridfs');                })                .pipe(writeStream);            writeStream.on('close', function (file) {                console.log(file.filename + 'written to DB');                fs.unlink(myFile);                myFile = null;                conn.close();            });        });        function writeToUserDb(uid, type, fileId, authInfo, title) {            console.info('called to write to user db without a \'this\' reference');            var userConn = mongoose.createConnection('mongodb://localhost/mean-auth', (error) => {                if (error) {                    console.error('Error connecting to the mean-auth instance'.red);                    process.exit(1);                } else {                    User.findById(uid, (err, doc) => {                        if (err) {                            console.error('Error finding user with id: ', uid);                            process.exit(1);                        } else {                            console.log('original doc: ', doc);                            doc.addMedia(type, fileId, authInfo, title);                            doc.save();                            console.log('new doc: ', doc);                        }                    })                }            });            userConn.close();        }    },    downloadFile: function (userId, file, fileType, objId, location, res) {        console.info('called to download file');        var id = new mongodb.ObjectID(objId);        var conn = mongoose.createConnection(mediaUri, (error) => {            assert.ifError(error);            var gfs = Grid(conn.db, mongoose.mongo);            gfs.findOne({_id: id}, (err, result) => {                if (err) {                    res.status(400).send(err);                } else if (!result) {                    res.status(404).send('Error finding file')                } else {                    res.set('Content-Type', result.contentType);                    res.set('Content-Disposition', 'attachment; filename="' + result.filename + '"');                    var readStream = gfs.createReadStream({                        _id: id,                        root: 'resume'                    });                    readStream.on('error', (err) => {                        res.end();                    });                    readStream.pipe(res);                }            });        });        conn.close();    },    deleteFile: function (userId, fileType, objId, res) {        var client = mongodb.MongoClient;        var id = new mongodb.ObjectID(objId);        console.log('object id to find is: ', id);        client.connect('mongodb://localhost/media', (err, db) => {            db.collection('fs.files', {}, (err, files) => {                files.remove({_id: id}, (err, result) => {                    if (err) {                        console.log(err);                        res.status(500);                    }                    console.log(result);                });            });            db.collection('fs.chunks', {}, (err, chunks) => {                chunks.removeMany({files_id: id}, (err, result) => {                    if (err) {                        console.log(err);                        res.status(500);                    }                    console.log(result);                });            });            db.close();        });        res.status(200).send({id: userId, type: fileType, ref: id});    },    getAll: function (req, res) {        var uid = req.query.id;        var conn = mongoose.createConnection('mongodb://localhost/mean-auth', (err) => {            if (err) {                console.error('Error connecting to mean-auth instance to read all');                process.exit(1);            } else {                User.findById(uid, (err, doc) => {                    if (err) {                        console.error('Error finding user with id: ', uid);                        process.exit(1);                    } else {                        if (doc) {                            console.log('original doc: ', doc);                            res.status(200).send({media: doc.media});                        } else {                            res.status(200);                        }                    }                })            }        });    }};


If you import the ObjectId object as follows:

const ObjectId = mongoose.Types.ObjectId;

at the top of your file as with a normal import, you can write the delete as follows:

const mongoose = require('mongoose');const Grid = require('gridfs-stream');const ObjectId = mongoose.Types.ObjectIdGrid.mongo = mongoose.mongo // assign the mongo driver to the Gridconst mongooseURI = 'mongodb://localhost/media';const conn = mongoose.createConnection(mongooseURI, {useNewUrlParser:true});conn.once('open', () => {        const gfs = Grid(conn.db);        gfs.exist({_id: ref}, (err, found) => {            if(err) {                console.error('error finding file'.red);            } else {                console.info('found file', found);                gfs.files.deleteOne({_id:new ObjectId(ref)}, (err, result) => {                    if(err) {                        console.error('error removing that file');                        process.exit(1);                    } else {                        console.info('removed file: ', found.green);                        deleteFromUserDb(id, type, ref);                        res.status(200).send({id: id, type: type, ref: ref});                    }                });            }        });

Hope this helps!