gridfs-stream icon indicating copy to clipboard operation
gridfs-stream copied to clipboard

Write stream on error doesn't work properly [error thrown directly from MongoDB native]

Open alessioalex opened this issue 11 years ago • 1 comments

Say you enforce an unique index on some metadata like so:

db.fs.files.ensureIndex({ 'metadata.id': 1 }, { unique: true })

Then if you're trying to insert a duplicate this happens:

MongoError: E11000 duplicate key error index: sample-gridfs.fs.files.$metadata.id_1  dup key: { : null }
    at Object.toError (/Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/utils.js:110:11)
    at /Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/collection/core.js:633:24
    at Server.Base._callHandler (/Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/connection/base.js:442:41)
    at /Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/connection/server.js:485:18
    at MongoReply.parseBody (/Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
    at null.<anonymous> (/Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/connection/server.js:443:20)
    at EventEmitter.emit (events.js:95:17)
    at null.<anonymous> (/Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:191:13)
    at EventEmitter.emit (events.js:98:17)
    at Socket.<anonymous> (/Users/alexandruvladutu/www/node_modules/mongodb/lib/mongodb/connection/connection.js:418:22)

The writeStream should throw the error.

The sample code:

var fs = require('fs');
var mongo = require('mongodb');
var Grid = require('gridfs-stream');

// create or use an existing mongodb-native db instance.
// for this example we'll just create one:
var db = new mongo.Db('sample-gridfs', new mongo.Server("127.0.0.1", 27017), {safe: true});

// make sure the db instance is open before passing into `Grid`
db.open(function (err) {
  if (err) { throw err; }

  var gfs = Grid(db, mongo);

  // streaming to gridfs
  var writeStream = gfs.createWriteStream({
    filename: 'sample_file.js'
  });

  writeStream.on('error', function(err) {
    throw err;
  });

  fs.createReadStream(__filename).pipe(writeStream).on('close', function() {
    // streaming from gridfs
    var readstream = gfs.createReadStream({
      filename: 'sample_file.js'
    });

    //error handling, e.g. file does not exist
    readstream.on('error', function (err) {
      throw err;
    });

    readstream.pipe(process.stdout);
    readstream.on('end', function() {
      db.close();
    });
  });
});

alessioalex avatar Feb 02 '14 15:02 alessioalex

Could you please see if this issue still exists in the just released 1.0.0? If so, can you let us know and contribute a unit test?

Thanks

Reggino avatar Feb 11 '15 20:02 Reggino