如何使用Node Express将Handlebars HTML页面呈现为文件

14
我想通过wkhtmltopdf将一些HTML页面转换为PDF。然而,我想要将其转换为PDF的HTML页面是使用handlebars动态生成的。 因此,我的一个解决办法可能是通过handlebars生成HTML页面但输出到文件(HTML文件)。然后,使用hkhtmltopdf将该文件转换为PDF,最后允许用户以某种方式下载该PDF。
那么,我的问题是:如何将(handlebars)动态生成的HTML页面呈现到文件中?
谢谢,再见...

1
从这里的https://npmjs.com/package/handlebars中检查第一个使用示例,然后使用fs.writeFile将其写入您的文件。 - Miroshko
嗨,Miroshko,感谢您的回答;请看下面我的评论... - Manuel Rivera
3个回答

16

创建文件的简单示例。

var Handlebars = require('handlebars');

var source = "<p>Hello, my name is {{name}}. I am from {{hometown}}. I have " +
    "{{kids.length}} kids:</p>" +
    "<ul>{{#kids}}<li>{{name}} is {{age}}</li>{{/kids}}</ul>";
var template = Handlebars.compile(source);

var data = { "name": "Alan", "hometown": "Somewhere, TX",
    "kids": [{"name": "Jimmy", "age": "12"}, {"name": "Sally", "age": "4"}]};
var result = template(data);


var fs = require('fs');
    fs.writeFile("test.html", result, function(err) {
    if(err) {
        return console.log(err);
    }
});

1
嗯,我有点困惑。首先,我使用:var exphbs = require('express-handlebars')。当我尝试执行“compile”时,我收到了这个错误:“Handlebars没有'compile'方法”。我在一个不同的文件中使用此代码,而不是“main”,在那里我使用“create”方法配置Express。我尝试在此文件中添加“create”部分,但错误仍然存在。由于我需要将其放在另一个文件(another.js)中而不是“main”中,我从“main.js”中请求它,我该怎么做才能让Handlebars接受“compile”方法? - Manuel Rivera
我认为'express-handlebars'不是官方的完整套件。使用这个 - https://www.npmjs.com/package/handlebars - Alex Khlebaev

4
使用express-handlebars时,应使用高级模式,并像这个示例中所示创建一个实例。
正确的方法是创建一个视图文件(就像您可能已经根据您的问题创建了),并使用express handlebars实例来呈现它。
// init code
var exphbs = require('express-handlebars');
var hbs = exphbs.create({
    defaultLayout: 'your-layout-name',
    helpers: require("path-to-your-helpers-if-any"),
});
app.engine('.file-extention-you-use', hbs.engine);
app.set('view engine', '.file-extention-you-use');

// ...then, in the router
hbs.render('full-path-to-view',conext, options).then(function(hbsTemplate){
     // hbsTemplate contains the rendered html, do something with it...
});

HTH


0

Alex的代码完美运行。然而,我的困惑是:我使用的是'express-handlebars'而不是'handlebars'。现在,我能理解的是Express-Handlebars是用于Express应用程序的Handlebars实现,这正是我正在使用的。我只是找不到一种在Express-Handlebars中使用'compile()'方法的方法,所以最终我安装了Handlebars(独立版),并将其用于编译我的(html)模板并将结果保存到磁盘上,就像Alex上面解释的那样。

总之: 1)我知道Express-Handlebars是用于Express应用程序的Handlebars。 2)我不知道如何仅从express-handlebars中使用“compile()”方法,因此最终我安装了Handlebars(从npm)并在服务器上使用它来生成我的html文件(从模板)并将其保存到磁盘上。 3)当然,我在我的Express应用程序中安装和使用Express-Handlebars来服务我的页面;只是安装了Handlebars来使用“compile()”方法在服务器上生成我的html并将结果保存到磁盘上。

希望这可以理解。再次感谢,再见...


这应该只是一条注释,而不是另一个答案,如果Alex的答案正确,您应该接受它。 - Antonius Bloch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接