2016-02-12 88 views
0

我想在nodejs應用程序中使用gridfs-stream。db連接初始化 - nodejs

一個簡單的例子是在documentation給出:

突入Grid

之前,請確保數據庫實例是開放的:

var mongoose = require('mongoose'); 
var Grid = require('gridfs-stream'); 
Grid.mongo = mongoose.mongo; 

mongoose.connect('mongodb://localhost:27017/test'); 

// make sure the db instance is open before passing into `Grid` 
mongoose.connection.once('open', function() { 
    var gfs = Grid(mongoose.connection); 

    // all set! 
}) 

我的問題是由註釋說明

我嘗試在帖子請求中使用gfs。現在,當代碼初始化時,gfs變量尚未定義。

api.post('/upload', function(req, res) { 
    req.pipe(gfs.createWriteStream({ 
    filename: 'test' 
    }).on('close', function(savedFile){ 
    console.log('file saved', savedFile); 
    return res.json({file: savedFile}); 
    })); 
}) 

從回調初始化我的路由似乎有點奇怪。我寫在這篇文章(Asynchronous initialization of Node.js module),要求('')是同步執行的,因爲我依靠建立的連接,我有點迫不及待

基本上我不知道如果我應該現在在啓動時使用異步模式,或者如果我只想念一個更優雅的方式來解決這個問題。

+0

應用所有東西並創建應用程序很常見,然後**開始監聽傳入的請求。因此,當你第一次請求時,數據庫將被連接。沒有什麼不好,等待它並執行回調。使用'EventEmitter'更好,只是發出一個事件 - 它很容易,靈活並且解耦。 –

+0

好吧,所以我去那:)謝謝你的快速回復 – Stefan

回答

0

我有一個非常類似的問題,我的服務器。在我的情況下,我正在異步讀取https證書,git的軟件版本是異步讀取的,我希望確保在用戶登錄時將所有這些都集中在一起,以便我可以將軟件版本作爲回覆登錄。

解決方案是使用承諾。爲每個活動創建用戶啓動的承諾。然後在你想要確保它已經準備就緒的代碼中,只需調用諾言本身或Promise.all(承諾數組)即可。然後()

下面是我正在閱讀的一個示例啓動服務器的SSL證書

class Web { 
    constructor(manager,logger) { 
     var self = this; 
     this.server = false; 
     this.logger = logger; 
     var key = new Promise((resolve,reject) => { 
     fs.readFile(path.resolve(__dirname, 'key.pem'),(err,data) => { 
      if (err) { 
      reject(err); 
      } else { 
      resolve(data); 
      } 
     }); 
     }); 
     var cert = new Promise((resolve,reject) => { 
     fs.readFile(path.resolve(__dirname, 'certificate.pem'), (err,data) => { 
      if (err) { 
      reject(err); 
      } else { 
      resolve(data); 
      } 
     }); 
     }); 

     Promise.all([key,cert]).then(values => { 
     var certs = { 
      key: values[0], 
      cert: values[1], 
     }; 
     return certs; 
     }).then(certs => { 
     self.server = require('http2').createServer(certs,(req,res) => { 
     // NOW Started and can do the rest of the stuff 
     }); 
     self.server.listen(...); 
     }); 
NEEDS SOME MORE CLOSING BRACKETS