hapijs渲染xml,如站点地图,Feed

时间:2015-08-03 15:28:24

标签: xml hapijs

我无法在hapijs中找到任何用于渲染xml输出的文档,目前我的视图呈现如下:

server.route({
  path: "/feed/{tag}",
  method: "GET",
  handler: function(req, resp) {
    var tag = req.params.tag;
    Post.findByTag(tag).sort({date: -1}).exec()
        .then(function(posts){
            resp.view("feed", {posts: posts, updated: posts[0].date}, {layout: false});
        });
}
});

我的把手模板feed.hbs是:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>{{ site.siteTitle }}</title>
  <link href="{{site.siteBaseUrl}}"/>
  <author>
    <name>Adam Stokes</name>
  </author>
  <updated>{{updated}}</updated>
  <id>{{site.siteBaseUrl}}</id>
  {{#each posts}}
  <entry>
    <title>{{this.title}}</title>
    <link href="{{site.siteBaseUrl}}/{{this.permalink}}"/>
    <id>{{site.siteBaseUrl}}/{{this.permalink}}</id>
    <updated>{{this.date}}</updated>
    <summary>{{md this.md}}</summary>
  </entry>
  {{/each}}

</feed>

问题:

在浏览器中查看输出不会呈现为正常的xml输出,但看起来像是文本。

问题是如何确保输出具有正确的标题以便以正确的xml格式呈现?

1 个答案:

答案 0 :(得分:2)

手柄正确呈现XML,只是您的浏览器将其解释为HTML而不是XML。您只需要指明内容类型是XML:

server.route({
    path: '/feed/{tag}',
    method: "GET",
    handler: function (request, reply) {

        var tag = req.params.tag;
        Post.findByTag(tag).sort({date: -1}).exec()
        .then(function(posts){

            var response = reply.view('feed', {posts: posts, updated: posts[0].date}, {layout: false});
            response.type('application/xml');
        });
    }
});

<强>除了:

我建议您使用标准参数名称requestreply。您选择resp看起来很像它代表一个响应对象,但这不是它的本质。这是reply() interface。回复界面实际上返回response object(如我的回答所示),其中包含设置内容类型等的方法。