我无法在meteorjs 中使用imagemagick。我正在开发一个小型 svg->png 转换器,其中包含一个 REST API 来提供转换后的图像。我用meteor-router实现了其余的api。 imagemagick 转换有效。但是,我无法将转换结果写入 http 响应中。我尝试通过使用光纤消除异步性来解决这个问题。但这仍然行不通。基本上,所有 request.write 调用在执行完之后都会被忽略。这是我的代码:
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还很陌生。因此,我可能完全错误地使用 Fiber。或者我根本不应该使用纤维。有人可以帮忙吗?
感谢meteor-router的作者,我能够解决这个问题。我使用纤维的方式是错误的。如所述https://github.com/laverdet/node-fibres#futures https://github.com/laverdet/node-fibers#futures,不建议在代码和原始 API 之间没有抽象的情况下使用 Fiber。
幸运的是,Fiber 提供了一种称为 future 的抽象,它可以用于我的用例!这是工作代码:
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();
});
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)