使用ExpressJS和Node将发布的文件存储到MongoDB GridFS

时间:2013-03-27 20:00:48

标签: node.js mongodb express gridfs

我正在尝试通过使用本机驱动程序将文件放入MongoDB的gridfs系统来处理发布到Express站点的文件。

我遇到的问题是,在gridStore对象准备就绪之前,请求的所有块都已发送过。将request.on('data'...处理程序放置在gridStore准备就绪后执行的回调中也不起作用。在那里,似乎所有的块都在回调之前发送,设置处理程序来捕获这是一个明显不完整的例子(我从未看到“chunk”登录到控制台):

var Db = require('mongodb').Db,
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,
    ObjectID = require('mongodb').ObjectID,
    GridStore = require('mongodb').GridStore,
    db;

db = new Db('dbName', new Server('serverAddress', 27017), { safe: false });
db.open(function (err, db) {
    console.log("db open");
    var gridStore = new GridStore(db, new ObjectID(), 'fileName', "w");
    gridStore.open(function (err, gridStore) {
        console.log("gridStore open");
        req.on('data', function (chunk) {
            console.log("chunk");
            gridStore.write(chunk, function () {});
        });
    });
})

我想知道在Express网站的路由中是否有办法阻止流进入,直到gridStore准备就绪。或者,我希望以同步方式设置gridStore(如果存在)。

2 个答案:

答案 0 :(得分:0)

我通过将传入的帖子写入临时文件来解决我的问题。它确实减慢了一些事情,但缓存实际上发生得非常快,特别是与写入GridFS相比。

答案 1 :(得分:0)

当收到新的数据块时,您可以使用req.pause()。从gridStore.write()调用时返回req.resume()。并在请求'结束'事件时,关闭gridStore。