3

meteorjs で imagemagick を使用できません。私は、変換された画像を提供する残りの API を含む小さな svg->png コンバーターに取り組んでいます。meteor-router を使用して残りの API を実装しました。imagemagick 変換が機能します。しかし、変換結果をhttpレスポンスに書き込めません。ファイバーを使用して非同期性を取り除くことで、これを修正しようとしました。しかし、これはまだ機能しません。基本的に、すべての request.write 呼び出しは、yield 実行後に無視されます。これが私のコードです:

Meteor.Router.add({
  '/image/:hash' : function(hash) {

    var svg = Images.findOne({'hash' : hash}).svg;

    var request = this.request;
    var response = this.response;

    Fiber(function() {
      var fiber = Fiber.current;

      response.writeHead(200, {'Content-Type':'image/png'});

      var convert = imagemagick.convert(['svg:-', 'png:-']);

      convert.on('data', function(data) {
        response.write("doesn't work");
        //response.write(data);
      });

      convert.on('end', function() {
        response.write("doesn't work");
        //response.end();
        fiber.run({});
      });

      convert.stdin.write(svg);
      convert.stdin.end();

      response.write("works");
      Fiber.yield();
      response.write("doesn't work");
    }).run();

  }
});

私はmeteorjsにかなり慣れていません。したがって、ファイバーを完全に間違って使用する可能性があります。または、繊維をまったく使用しないでください。誰か助けてくれませんか?

4

2 に答える 2

4

meteor-router の作者のおかげで、問題を解決できました。私は繊維を間違った方法で使用していました。https://github.com/laverdet/node-fibers#futuresで説明されているように、コードと未加工の API 間の抽象化なしでファイバーを使用することはお勧めしません。

幸いなことに、ファイバーは、私のユースケースに使用できる未来と呼ばれる 1 つの抽象化を提供します! 作業コードは次のとおりです。

var require = __meteor_bootstrap__.require,
Future  = require('fibers/future');

Meteor.startup(function() {
  Meteor.Router.add('/image/:hash', function(hash) {
    var response = this.response;
    var fut = new Future();

    response.writeHead(200, {'Content-Type':'text/plain'});

    setTimeout(function(){ 
      response.write("hello hello");
      fut.ret();
    }, 1); 

    fut.wait();
  });
});
于 2012-12-17T07:30:54.553 に答える
0

さらに調査を行いました。この問題は、imagemagick とは直交しています。例: 次のコード スニペットは meteor-router では機能しません。

例 1:

Meteor.startup(function() {                                                        
  Meteor.Router.add({                                                              
    '/image/:hash' : function(hash) 

      var request = this.request;                                                  
      var response = this.response;                                                

      response.write("outside");                                                   

      setTimeout(function(){                                                       
        response.write("inside");                                                  
        response.end();                                                            
      }, 1); 
    }                                                                           
  }); 

例 2:

Meteor.startup(function() {                                                        
  Meteor.Router.add({                                                              
    '/image/:hash' : function(hash) 
      var request = this.request;                                               
      var response = this.response;                                             

      response.write("outside");                                                

      Fiber(function() {                                                        
        var fiber = Fiber.current;                                              

        setTimeout(function(){                                                  
          response.write("inside");                                             
          response.end();                                                       
        }, 1);                                                                  
        Fiber.yield();                                                          
      }).run();   
    }                                                                           
  }); 

meteor-routerの一般的な問題だと思います。どちらの例も純粋な nodejs で動作するためです。

于 2012-12-15T12:34:29.373 に答える