快速入门

该教程适用于 hapi v17版本

安装 hapi

新建一个目录 myproject:

  • 运行: cd myproject 跳转到目录内。
  • 运行: npm init 根据提示生成文件 package.json。
  • 运行: npm install —save hapi@17.x.x 将安装 hapi ,并将相应的依赖并保存至 package.json 中。就是这么简单! 你现在已经做好了创建一个 hapi 应用的全部准备。

创建一个Web服务器

最基本的Web服务器代码如下:

  1. 'use strict';
  2.  
  3. const Hapi = require('hapi');
  4.  
  5. const server = Hapi.server({
  6. port: 3000,
  7. host: 'localhost'
  8. });
  9.  
  10. const init = async () => {
  11.  
  12. await server.start();
  13. console.log(`Server running at: ${server.info.uri}`);
  14. };
  15.  
  16. process.on('unhandledRejection', (err) => {
  17.  
  18. console.log(err);
  19. process.exit(1);
  20. });
  21.  
  22. init();

首先引入 hapi,之后我们创建一个 web 服务器并且配置好 host 以及需要监听的端口,最后我们启动这个服务器,并且将运行的信息输出到日志中。

Web 服务器可以通过以下方式创建:指定主机名、填写IP地址、Unix socket文件或者通过Windows管道绑定到指定的服务器。更多细节内容请参考 API reference.

添加路由

现在已经有了一个简单的Web服务器,下面将添加两条路由:

  1. 'use strict';
  2.  
  3. const Hapi = require('hapi');
  4.  
  5. const server = Hapi.server({
  6. port: 3000,
  7. host: 'localhost'
  8. });
  9.  
  10. server.route({
  11. method: 'GET',
  12. path: '/',
  13. handler: (request, h) => {
  14.  
  15. return 'Hello, world!';
  16. }
  17. });
  18.  
  19. server.route({
  20. method: 'GET',
  21. path: '/{name}',
  22. handler: (request, h) => {
  23.  
  24. return 'Hello, ' + encodeURIComponent(request.params.name) + '!';
  25. }
  26. });
  27.  
  28. const init = async () => {
  29.  
  30. await server.start();
  31. console.log(`Server running at: ${server.info.uri}`);
  32. };
  33.  
  34. process.on('unhandledRejection', (err) => {
  35.  
  36. console.log(err);
  37. process.exit(1);
  38. });
  39.  
  40. init();

将以上代码保存至 server.js 之后通过命令 node server.js启动服务器。在浏览器中访问 http://localhost:3000, 你将会看到以下文本 Hello, world!, 之后再访问 http://localhost:3000/stimpy 你将会看到 Hello, stimpy!

请注意这里使用了 URI 编码, 这可以有效地防止内容注入攻击。 因此,尽量使用内容编码去处理用户输入的信息。

method 可以使用任何有效的 HTTP 方法或者 HTTP 方法数组,又或者使用*去通配所有方法。path 定义了该路径下所包含的参数,可以为可选参数,数字以及通配符。更多细节内容请参考 路由教程.

建立静态内容

我们已经验证了了可以使用 Hello World 应用程序启动一个简单的hapi应用。 之后我们将使用一个名为 inert 的插件去创建静态页面。 在你开始之前,通过命令 CTRL + C 停止你的服务器。

安装 inert 使用以下命令: npm install —save inert 这将会下载 inert 包,并且将其添加到用于记录依赖的 package.json 文件中。

在你的 server.js 文件中修改 init 函数如下:

  1. const init = async () => {
  2.  
  3. await server.register(require('inert'));
  4.  
  5. server.route({
  6. method: 'GET',
  7. path: '/hello',
  8. handler: (request, h) => {
  9.  
  10. return h.file('./public/hello.html');
  11. }
  12. });
  13.  
  14. await server.start();
  15. console.log(`Server running at: ${server.info.uri}`);
  16. };

通过 server.register() 命令将插件 inert 注册到你的 hapi 应用中。

server.route() 将注册 /hello 路由, 并接收一个 GET 请求,此请求将会返回文件 hello.html。 这里我们在注册 inert 插件之后才注册路由,通常明智的做法是在注册插件后才运行依赖于插件的代码,这将在代码运行时可以确保插件已经存在。

通过 node server.js 启动你的服务,并在浏览器内访问http://localhost:3000/hello。哦 糟糕! 因为我们没有创建 hello.html 文件所以出错了。下面我们来创建缺失的文件来修正这个问题。

在你的根目录下新建一个名为 public 的文件夹,之后在里面创建一个名为 hello.html 的文件。 hello.html 内代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Hapi.js is awesome!</title>
  6. </head>
  7. <body>
  8. <h1>Hello World.</h1>
  9. </body>
  10. </html>

这是一份简单并符合规范的 HTML5 文档。

在浏览器内重新载入这个页面,你将会看到标题 "Hello World."。

当你对硬盘上的文件作出修改的时候 Inert 将会自动重新加载这些文件。 你可以根据自己的喜好调整这个页面。

更多关于静态内容的细节请访问 静态内容。这项技术一般用于图片,css样式文件以及静态页面。

使用插件

日志对于 Web 开发的重要性毋庸置疑,我们通过 hapi pino 插件为应用提供日志服务。

通过npm安装所需要的插件:

  1. npm install hapi-pino

之后修改 server.js 如下:

  1. 'use strict';
  2.  
  3. const Hapi = require('hapi');
  4.  
  5. const server = Hapi.server({
  6. port: 3000,
  7. host: 'localhost'
  8. });
  9.  
  10. server.route({
  11. method: 'GET',
  12. path: '/',
  13. handler: (request, h) => {
  14.  
  15. return 'Hello, world!';
  16. }
  17. });
  18.  
  19. server.route({
  20. method: 'GET',
  21. path: '/{name}',
  22. handler: (request, h) => {
  23.  
  24. // request.log(['a', 'name'], "Request name");
  25. // or
  26. request.logger.info('In handler %s', request.path);
  27.  
  28. return `Hello, ${encodeURIComponent(request.params.name)}!`;
  29. }
  30. });
  31.  
  32. const init = async () => {
  33.  
  34. await server.register({
  35. plugin: require('hapi-pino'),
  36. options: {
  37. prettyPrint: false,
  38. logEvents: ['response', 'onPostStart']
  39. }
  40. });
  41.  
  42. await server.start();
  43. console.log(`Server running at: ${server.info.uri}`);
  44. };
  45.  
  46. process.on('unhandledRejection', (err) => {
  47.  
  48. console.log(err);
  49. process.exit(1);
  50. });
  51.  
  52. init();

当服务器启动的时候你将会看到以下内容:

  1. [2017-12-03T17:15:45.114Z] INFO (10412 on box): server started
  2. created: 1512321345014
  3. started: 1512321345092
  4. host: "localhost"
  5. port: 3000
  6. protocol: "http"
  7. id: "box:10412:jar12y2e"
  8. uri: "http://localhost:3000"
  9. address: "127.0.0.1"

之后在浏览器内访问 http://localhost:3000/ 我们可以看到请求的信息已经输出到了终端中。

日志可以通过 options 配置并注册到服务中。

很好! 这只是使用插件的一个简短示例, 更多信息请查看插件教程 插件教程

其他

hapi 拥有许多其他的功能,此教程只记录了其中少数几个功能,你可以在右侧的列表中找到它们。 其余内容请参阅 API reference。 欢迎在 github 提问,或者在 slack 找到我们。