2012-12-13 101 views
3

我無法在meteorjs中使用imagemagick。我正在處理一個小的svg-> png轉換器,其中包含一個用於提供轉換圖像的rest api。我用流星路由器實現了其餘的api。 imagemagick轉換工作。但是,我無法將轉換的結果寫入http響應。我試圖通過使用光纖消除異步性來解決這個問題。但這仍然行不通。基本上,所有request.write調用在yield執行後都會被忽略。這裏是我的代碼:imagemagick在meteorjs(藉助流星路由器和光纖)

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。因此,我可能會使用完全錯誤的光纖。或者我不應該使用光纖。有人可以幫忙嗎?

+0

我不認爲你的問題與光纖有關,如果'convert.on('data',...)'回調從不觸發。你確定這個代碼在香草節點工作嗎?你在使用node-imagemagick(https://github.com/rsms/node-imagemagick)嗎?我在他們的文檔中找不到對'.on'的引用 - 他們建議將第二個回調參數傳遞給'.convert'。 – avital

回答

4

感謝來自流星路由器的作者,我能夠解決這個問題。我以錯誤的方式使用光纖。如https://github.com/laverdet/node-fibers#futures所述,不建議在代碼和原始API之間沒有抽象的情況下使用光纖。

幸運的是,光纖提供了一種被稱爲未來的抽象,可以用於我的用例!這裏是工作代碼:

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(); 
    }); 
}); 
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(); 
    }); 
}); 
0

我做了一些更多的調查。這個問題與imagemagick是正交的。例如: - 下面的代碼片段不流星路由器工作過:

例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(); 
    }                   
    }); 

我想這是流星路由器的一般問題。因爲這兩個示例都可以使用純節點j。