hapijs 呈现 xml 像站点地图、提要
hapijs render xml like sitemaps, feeds
我在 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 输出,但看起来是文本。
问题是如何确保输出具有正确的 headers 以便以正确的 xml 格式呈现?
车把正确呈现 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');
});
}
});
旁白:
我建议您使用标准参数名称 request
和 reply
。您选择的 resp
看起来很像是代表一个响应对象,但事实并非如此。 reply()
interface. The reply interface actually returns a response object(如我的回答所示)具有设置内容类型等的方法
我在 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 输出,但看起来是文本。
问题是如何确保输出具有正确的 headers 以便以正确的 xml 格式呈现?
车把正确呈现 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');
});
}
});
旁白:
我建议您使用标准参数名称 request
和 reply
。您选择的 resp
看起来很像是代表一个响应对象,但事实并非如此。 reply()
interface. The reply interface actually returns a response object(如我的回答所示)具有设置内容类型等的方法