我正在尝试通过使用本机驱动程序将文件放入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(如果存在)。
答案 0 :(得分:0)
我通过将传入的帖子写入临时文件来解决我的问题。它确实减慢了一些事情,但缓存实际上发生得非常快,特别是与写入GridFS相比。
答案 1 :(得分:0)
当收到新的数据块时,您可以使用req.pause()。从gridStore.write()调用时返回req.resume()。并在请求'结束'事件时,关闭gridStore。