【问题标题】:GridFS put() with Mongoose dies in write concern code?带有 Mongoose 的 GridFS put() 在写关注代码中死掉了?
【发布时间】:2015-02-16 18:13:11
【问题描述】:

我有以下代码(修剪,假设所有关闭的东西都在那里),它在 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 只是没有设置这个,我猜。

【问题讨论】:

    标签: javascript node.js mongodb mongoose gridfs


    【解决方案1】:

    我可以通过在打开连接后手动设置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(),这样我可以保存文件,但不能保存文档。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        相关资源
        最近更新 更多