Node.js 使用meteor wkhtmltopdf在页面上下载元素的PDF

Node.js 使用meteor wkhtmltopdf在页面上下载元素的PDF,node.js,meteor,wkhtmltopdf,Node.js,Meteor,Wkhtmltopdf,我试图触发DOM中呈现的D3生成元素的服务器端,然后在响应中将最终PDF传递回客户端 简而言之,我正在做的是: Meteor.methods({ downloadPdf: function(data, node) { var filename = data.slug + "-" + data.size, headers = { 'Content-Type': 'application/pdf', 'Content-Disposi

我试图触发DOM中呈现的D3生成元素的服务器端,然后在响应中将最终PDF传递回客户端

简而言之,我正在做的是:

Meteor.methods({
  downloadPdf: function(data, node) {
    var filename = data.slug + "-" + data.size,
        headers = {
          'Content-Type': 'application/pdf',
          'Content-Disposition': "attachment; filename=" + filename + ".pdf"
        };
    this.response.writeHead(200, headers);
    var r = wkhtmltopdf(node).pipe(this.response);
    return r;
  }
});
我是这样称呼客户的:

Template.getPDF.events({
  'click .pdf-export-button': function(e) {
    var data = Router.current() && Router.current().data();
    if (data) {
      var node = d3.select(".pdf-export-preview").node().innerHTML;
      Meteor.call("downloadPdf", data, node, function(err, result) {
        // response goes here?
      });
    }
  }
});
问题是,上面的代码在
Meteor.call
回调上返回了一个500错误,我的终端告诉我这是:
调用方法'downloadPdf'TypeError时异常:无法调用未定义的方法'writeHead'。似乎表明响应还没有准备好,或者类似的东西。我真的不知道如何解决这个问题。任何帮助都将不胜感激


另外,我找到的一个解决方案是,但这是一个问题,因为我需要能够将渲染的D3 SVG传递给wkhtmltopdf(以及PDF的一些配置文件)。

Hm,进一步检查后,它看起来像是传递了节点,因为它导致了调用堆栈错误-因此我正在执行
var node=D3.select(.PDF导出预览”).node().innerHTML取而代之。但仍然不确定如何通过管道将呈现的PDF作为响应。越来越近了,但仍然出现一些奇怪的错误。编辑了这个问题来反映这一点。汤姆,你知道这一点吗?有同样的问题。我也不想通过服务器端路由器调用对呈现的PDF进行管道处理(我想发送一个只有经过身份验证时才可见的模板,这是一个问题,因为服务器端路由器不容易访问Meteor.user)。有什么进展吗?嘿@JonnyMD,我的错,已经有一段时间没有真正登录StackOverflow了。我最终使用Iron路由器路由,并将数据传递给服务器本身呈现的模板。这里的例子(这个项目现在是开源的):如果您仍然在寻求这方面的帮助,请告诉我!我很乐意看一看。