创建可以为复杂网页提供服务的HapiJs服务器

时间:2016-05-13 13:37:24

标签: node.js rest hapijs

我刚开始学习Node.js和hapi.js.我现在要完成的是构建一个REST Web服务器,该服务器还应该具有用于​​配置和统计信息收集的Web界面。

我发现Inert插件允许提供静态页面,据我所知,这限制了我加载一个由单个文件组成的网页。

但是,我不明白的是,是否可以设置hapi.js来提供包含cssjs以及其正文中引用的其他文件的完整动态网页。

我是否朝着错误的方向前进,否则我该如何设置我的方案?

2 个答案:

答案 0 :(得分:1)

您可以从指定目录提供多个静态文件。

使用此示例尝试inerthapi

https://github.com/hapijs/inert#static-file-server

Inert从给定目录提供多个静态文件没有问题,例如public

因此,从指定的目录提供多个静态html,css,js文件没有问题。然后,您可以使用Hapi构建动态JSON api,并使用您的js客户端代码使用它,从公共目录中的静态js文件提供。

如果您需要模板化,在服务器端生成动态内容,hapi可以直接执行此操作,请查看:

http://hapijs.com/tutorials/views

很抱歉,如果这不是您的意思,请随时澄清: - )

希望有所帮助!

答案 1 :(得分:1)

vision插件用于模板,这是我认为您之后的模板。如果要将css和js文件与页面捆绑在一起,可以将它们放在公共目录中,并使用inert plugin进行配置。然后你只需要在你试图渲染的任何html文件中引用相对路径。

这是一个使用handlebars的简单示例。 Inert负责提供您的css和js文件,而视觉仍然呈现您的模板。

./index.js

var hapi = require('hapi');

var server = new hapi.Server();
server.connection({port: 5555});

server.register([require('vision'), require('inert')], (err) => {
    if(err){
        throw err; 
    }

    server.views({
        engines: {
            html: require('handlebars')
        },
        relativeTo: __dirname + '/',
        path: 'www'
    });

    var homeroute = {
        method: 'GET',
        path: '/',
        handler: (request, reply) => {
            reply.view('index', {name: 'cuthbert'});
        }
    };

    var publicassetsroute = {
        method: 'GET',
        path: '/public/{param*}',
        handler: {
            directory: {
                path: './public',
                listing: false,
                index: false
            }
        }
    };

    server.route(homeroute);
    server.route(publicassetsroute);

    server.start((err) => {
        console.log('server started -- ' + server.info.uri)
    });

});

www/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hapi Test</title>
    <link rel="stylesheet" href="../public/index.css">
</head>
<body>
    <h1>A Hapi Happy Test.</h1>
    <p>This is a test page. Woo!</p>
    <p>My name is {{name}}.</p>
</body>
</html>

public/index.css

p {
    color: blue;
}