用Mongoose的GridFS put()死于写关注代码?

我有下面的代码(修剪,假设所有closures的东西都在那里),它们在GridFS内部深处:

var Grid = require('mongodb').Grid; var mongoose = require('mongoose'); var db = mongoose.connect('mongodb://localhost:27017/ksnap'); router.route('/').post(function(req, res) { var post = new Post(); var busboy = new Busboy({ headers: req.headers }); req.pipe(busboy); busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype); if (fieldname != 'img') { return; } var bufs = []; file.on('data', function(data) { console.log('File [' + fieldname + '] got ' + data.length + ' bytes'); bufs.push(data); }); // busboy file on data file.on('end', function() { console.log('File [' + fieldname + '] Finished'); var buf = Buffer.concat(bufs); var grid = new Grid(db, 'fs'); grid.put(buf, {metadata:{category:'image'}, content_type: 'image'}, function(err, result) { if (err) { console.log(err); } else { console.log(result); } }); 

堆栈跟踪:

 /opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:1552 } else if(self.safe.w != null || typeof self.safe.j == 'boolean' || typeof s ^ TypeError: Cannot read property 'w' of undefined at _getWriteConcern (/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:1552:22) at Stream.GridStore (/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:100:23) at Grid.put (/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/grid.js:52:19) at FileStream.<anonymous> (/opt/ksnap-server/server.js:83:13) at FileStream.emit (events.js:117:20) at _stream_readable.js:943:16 at process._tickCallback (node.js:419:13) 

Busboy返回一个我放入缓冲区的stream,非常好。 这工作正常,我已经testing过了。 但是,当我尝试grid.put()缓冲区,它如上所述死亡。 我试图追查,但我遇到了麻烦。 据我所知,所有的选项在grid.js中被占用,所以当它们被传递给gridstore.js时,它只是一个空的对象。 mongoose只是不设置这个,我猜。

我能够通过手动设置db.safe = {w: 1};来获得这个错误db.safe = {w: 1}; 打开连接后,但是当我做了grid.put()它只是卡在那里。 为了正常的mongodb连接交换mongoose工作,所以我猜目前mongoose只是不能与GridFS的工作。

我终于可以通过添加streamifier和gridfs-stream模块以及下面的mongo设置来获得所有(显然)工作:

 var streamifier = require('streamifier'); var Grid = require('gridfs-stream'); mongoose.connect('mongodb://localhost:27017/ksnap'); 

然后,当我准备将文件保存到GridFS时:

 var gfs = new Grid(mongoose.connection.db, mongoose.mongo); var writestream = gfs.createWriteStream({ mode: 'w', filename: post.id, content_type: 'image/jpeg' }); streamifier.createReadStream(buffer).pipe(writestream); writestream.on('close', function (file) { console.log("saved 300px as "+file.filename); }); 

并将文档保存到MongoDB中:

 post.save(function(err) { if (err) { res.send(err); } console.log('saved post '+post.id); res.send(post); }); 

这是为我工作的选项的组合。 其中一个键是使用mongoose.connect() ,而不是mongoose.createConnection() ,它可以让我保存文件,而不是文档。

我知道这已经有一段时间了 – 我看到了同样的问题 – 确保您的mongoose会话连接到数据库 – 即mongoose.connection.once("connected", function () {...}已被调用,然后加载需要的文件和文件,这样可以确保连接中的数据库对象绑定到现有的mongo会话,如果你发现mongoose.connection.db为null, mongoose.connection不为空,那么你将初始化你的网格stream未初始化的mongodb连接。