2016-02-12 109 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