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

私の問題はコメントで説明されています:

渡す前にdbインスタンスが開いていることを確認してください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 自体または Promise.all(array of promises).then() のいずれかで 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 に答える