0

ネイティブ ドライバーを使用して、MongoDB の gridfs システムに配置することにより、Express サイトに投稿されたファイルを処理しようとしています。

私が経験している問題は、gridStore オブジェクトの準備が整う前に、リクエストのチャンクがすべて送信されたことです。gridStore の準備ができたら実行されるコールバック内に request.on('data'... ハンドラーを配置しても機能しません。そこでは、コールバックがハンドラーをキャッチするように設定する前に、すべてのチャンクが送信されるようです。これは明らかに不完全な例です (「チャンク」がコンソールに記録されることはありません):

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 () {});
        });
    });
})

gridStore の準備が整うまで、Express サイトのルート内からストリームを停止する方法があるかどうか疑問に思っています。あるいは、gridStore を設定する同期的な方法があれば、それが機能することを期待します。

4

2 に答える 2

0

新しいチャンクのデータを受信したときに req.pause() を使用できます。gridStore.write() からコールバックされた場合の req.resume()。リクエストの「終了」イベントで、gridStore を閉じます。

于 2013-05-10T16:56:22.523 に答える
0

受信投稿を一時ファイルに書き込むことで問題を解決しました。確かに少し遅くなりますが、特に GridFS への書き込みと比較すると、キャッシングは実際にはかなり速く行われます。

于 2013-04-11T01:33:54.310 に答える