gpt4 book ai didi

meteorjs 中的 imagemagick(借助 meteor-router 和 fibers)

转载 作者:行者123 更新时间:2023-12-04 03:03:56 26 4
gpt4 key购买 nike

我无法在 meteorjs 中使用 imagemagick。我正在开发一个小型 svg->png 转换器,它包含一个 rest api 来提供转换后的图像。我用 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 的新手。因此,我可能会完全错误地使用 Fiber。或者我根本不应该使用光纤。有人可以帮忙吗?

最佳答案

感谢 meteor-router 的作者,我能够解决这个问题。我以错误的方式使用光纤。如 https://github.com/laverdet/node-fibers#futures 所述,不建议在您的代码和原始 API 之间没有抽象的情况下使用纤程。

幸运的是,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();
});
});

关于meteorjs 中的 imagemagick(借助 meteor-router 和 fibers),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com