2013-03-27 2 views
0

Я пытаюсь обработать файл, отправленный на сайт Express, поместив его в систему gridfs MongoDB, используя собственный драйвер.Сохранение файла в MongoDB GridFS с использованием ExpressJS и узла

Проблема, с которой я столкнулся, заключается в том, что все части запроса были отправлены до того, как объект gridStore уже готов. Размещение запроса.on (обработчик «data» ... внутри обратного вызова, который выполняется после того, как gridStore готов, тоже не работает. Там, кажется, все куски отправляются перед обратным вызовом, устанавливая обработчик, чтобы поймать . им Это явно неполна пример (я никогда не видел «кусок» протоколирование в консоли):

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 готов. В качестве альтернативы, я бы ожидал синхронного способа настройки gridStore для работы, если таковой существует.

ответ

0

Я решил проблему, записав входящую почту во временный файл. Это определенно замедляет работу немного, но ca ching на самом деле происходит довольно быстро, особенно по сравнению с записью в GridFS.

0

Вы можете использовать req.pause() при получении нового фрагмента данных. и req.resume() при вызове из gridStore.write(). и по запросу «конец», закройте gridStore.

Смежные вопросы