1

我想在 nodejs 应用程序中使用 gridfs-stream。

文档中给出了一个简单的示例:

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!
})

评论描述了我的问题:

在传入之前确保数据库实例是打开的Grid

我尝试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});
  }));
})

从回调初始化我的路由似乎有点奇怪。我在这篇文章(Node.js 模块的异步初始化)中读到 require('') 是同步执行的,因为我依赖于建立的连接,所以我有点被迫等待

基本上我不确定我现在是否应该在启动时使用异步模式,或者我只是想念一种更优雅的方式来解决这个问题。

4

1 回答 1

0

我的服务器有一个非常相似的问题。在我的情况下,我正在异步读取 https 证书,异步读取来自 git 的软件版本,我想确保在用户登录时我将它们全部放在一起,以便我可以将软件版本作为对登录的回复传回。

解决方案是使用承诺。在用户启动时为每个活动创建承诺。然后在您想确保一切就绪的代码中,只需调用 promise 本身或 Promise.all(array of promises).then()

这是我正在阅读 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
于 2016-02-12T19:52:41.207 回答