Javascript 带有Mongoose的GridFS put()在写关注点代码中死亡?

Javascript 带有Mongoose的GridFS put()在写关注点代码中死亡?,javascript,node.js,mongodb,mongoose,gridfs,Javascript,Node.js,Mongodb,Mongoose,Gridfs,我有以下代码(经过修剪,假设所有的结尾都在那里),这些代码在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();

我有以下代码(经过修剪,假设所有的结尾都在那里),这些代码在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)
/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:无法读取未定义的属性“w”
在_getWriteConcern(/opt/ksnap server/node\u modules/mongodb/lib/mongodb/gridfs/gridstore.js:1552:22)
在Stream.GridStore(/opt/ksnap server/node_modules/mongodb/lib/mongodb/gridfs/GridStore.js:100:23)
在Grid.put(/opt/ksnap server/node_modules/mongodb/lib/mongodb/gridfs/Grid.js:52:19)
在文件流中。(/opt/ksnap server/server.js:83:13)
在FileStream.emit(events.js:117:20)
在_stream_readable.js:943:16
在进程中调用(node.js:419:13)

Busboy返回一个我放入缓冲区的流,目前为止还不错。这很好,我已经测试过了。但是当我尝试使用grid.put()时缓冲区,如上所述。我试图跟踪它,但我遇到了问题。据我所知,所有的选项都在grid.js中被吃掉了,所以当它们传递到gridstore.js时,它只是一个空对象。我猜Mongoose只是没有设置它。

我可以通过手动设置
db.safe={w:1}来克服这个错误打开连接后,当我执行
grid.put()
时,它就卡在那里了。将mongoose替换为常规的mongodb连接起作用了,所以我想目前mongoose不适用于GridFS

通过添加和模块以及以下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);
});
并将post文档本身保存到MongoDB:

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

这是对我有效的选项组合。其中一个键是使用
mongoose.connect()
,而不是
mongoose.createConnection()
,这将允许我保存文件,但不保存文档。

我知道这已经有一段时间了-我看到了相同的问题-确保您的mongoose会话已连接到DB-ie
mongoose.connection.once(“connected”,function(){…}
已被调用,然后加载require文件和文件。这确保连接中的db对象绑定到现有的mongo会话。如果您发现
mongoose.connection.db
为null且
mongoose.connection
不为null,则您将使用未初始化的mongodb连接初始化网格流。