Hapi车把模板不显示json对象数据

时间:2015-11-18 04:00:09

标签: node.js express handlebars.js hapijs

嘿伙计们,我有这个简单的处理程序,它读取一个mysql表并将json obj返回到这样的路径。

处理程序

var PostStore = {};

PostStore.getAllPosts = function(){
    conn.query('SELECT * FROM posts',function(err, result){
        if(err){
            console.log(err);
        }
        console.log(JSON.parse(JSON.stringify(result)));
        return JSON.parse(JSON.stringify(result));
    });
}


module.exports = PostStore;

路由器

{
    path: '/',
    method: 'GET',
    handler: function (request, reply) {
        console.log(PostStore.getAllPosts);
        reply.view('index', { 
            title: 'My home page',
            posts: PostStore.getAllPosts
        });
    }
}

的index.html

<h1>{{title}}</h1>

{{#each posts}}
<h1>{{this.title}}</h1>
{{/each}}

以下是控制台输出的内容

[Function]
[ { id: 1,
    title: 'Hello World',
    body: 'My First Post on this cool Hapi Blog!',
    date: null } ]

正如您所看到的,sql结果被解析为JSON obj但未从Handlebars中读取。另请注意,{{title}}正在显示&#34;我的主页&#34;如预期的那样。

任何帮助将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:0)

PostStore.getAllPosts是异步的,你需要在它的回调函数中呈现视图。

PostStore.getAllPosts(function (err, posts) {
// render the view 
});

答案 1 :(得分:0)

在视图中呈现异步方法的唯一方法是在预处理程序中调用此方法并分配返回值,以便可以在视图中呈现返回的数据。请参阅hapi的文档以获取进一步说明http://hapijs.com/api#route-prerequisites

在PostStore例程中使用此代码

PostStore.getAllPosts = function(callback){
    conn.query('SELECT * FROM posts',function(err, result){
        if(err){
            return callback(err);
        }

        return callback(result);
});

}

然后在处理程序代码中

const getPosts = function (request, reply) {

    ... // do something async to set posts
    PostStore.getAllPosts(function(err, results) {

        if (err) {
            return reply('Error occurred')
        }
        reply(results);
    };
};

server.route({
    method: 'GET',
    path: '/',
    config: {
        pre: [
            { method: getPosts, assign: 'posts' }
    ],
        handler: function (request, reply) {

            reply.view('index', { 
                title: 'My home page',
                posts: request.pre.posts,
            });
        }
    }
});