GridFS put()与Mongoose死在写关注代码?

时间:2014-12-18 02:43:41

标签: 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();
    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返回一个我放入缓冲区的流,到目前为止一直很好。这很好,我已经测试过了。但是当我尝试grid.put()缓冲区时,它会像上面那样死掉。我试图追踪它,但我遇到了麻烦。 据我所知,所有的选项都在grid.js中被吃掉了,所以当它们传递给gridstore.js时,它只是一个空对象。 Mongoose就是没有& #39;设置这个,我想。

2 个答案:

答案 0 :(得分:2)

我可以通过在打开连接后手动设置db.safe = {w: 1};来解决此错误,但是当我执行grid.put()时它只是卡在那里。交换mongoose以进行常规mongodb连接工作,所以我猜当前mongoose只是不能使用GridFS。

我终于能够通过添加streamifiergridfs-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(),这可以让我保存文件,但不能保存文档。

答案 1 :(得分:-1)

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