2015-06-18 71 views
0

我試圖下載使用GridFS保存在mongoDB中的+ 200M二進制文件。我的問題是下載無法啓動。我正在用mongodb和gridfs-stream使用nodejs。使用nodejs下載GridFs不會啓動

在routes.js:

router.get('/getlog',function(req,res) { 
    if (req.isAuthenticated()) 
    { 
     var mongo = require('mongodb'); 
     var Grid = require('gridfs-stream'); 
     var db = new mongo.Db('logApp', new mongo.Server("127.0.0.1", 27017)); 

     db.open(function (err) { 
      if (err) 
       return handleError(err); 
     }); 

     var gfs = Grid(db, mongo); 
     var id = req.query.id; 
     gfs.exist({_id: id}, function (err, found) { 
      if (err) return handleError(err); 
      if (!found) 
       res.send('Error on the database looking for the file.') 
     }); 

     var readStream = gfs.createReadStream({ 
      _id: id 
     }).pipe(res); 
    } 
    else 
     res.redirect('/login'); 
}); 

某處在我看來:

td #[a(href="getlog?id=#{log.logId}", download="logfile") #[span(name='log').glyphicon.glyphicon-download]] 

產生從一個的NodeJS響應登錄:

GET /getlog?id=55818770b276172922b945b8 - - ms - - 

,但從來沒有開始下載。 ..我不知道發生了什麼事..

+3

1.您不必在路由邏輯中打開數據庫連接,但可以在應用程序生命週期中執行此操作。 2.「回調」這些事情需要在「數據庫打開後」發生。 '.open()'調用是異步的。 –

+0

是的,我必須移動連接,但我想首先使用一個非常簡單的示例。出於某種原因,我已經將數據庫中的實際讀取放在回調之外。謝謝。 – cauchy

回答

1

改變

gfs.exist({_id: id}, function (err, found) { 
      if (err) return handleError(err); 
      if (!found) 
       res.send('Error on the database looking for the file.') 
     }); 

     var readStream = gfs.createReadStream({ 
      _id: id 
     }).pipe(res); 

gfs.exist({_id: id}, function (err, found) { 
      if (err) return handleError(err); 
      if (!found) 
       return res.send('Error on the database looking for the file.'); 
      gfs.createReadStream({_id: id}).pipe(res); 
     }); 

請嘗試。

+0

是的。我只是想出來並找到你的答案。我在回調之外撥打了電話。 – cauchy

相關問題