Node.js开源应用框架HapiJS介绍

  一、HapiJS介绍

  HapiJS是一个开源的、基于Node.js的应用框架,它适用于构建应用程序和服务,其设计目标是让开发者把精力集中于开发可重用的应用程序的业务逻辑,向开发者提供构建应用程序业务逻辑所需的基础设施。HapiJS目前的最新版本为7.2.0版。

  二、HapiJS安装和项目配置

  1、安装Hapi库

  HapiJS的安装很简单,执行如下命令:

  

复制代码 代码如下:

  $ sudo npm install hapi -g

  [email protected] /usr/local/lib/node_modules/hapi

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected] ([email protected])

  ├── [email protected] ([email protected])

  ├── [email protected] ([email protected])

  ├── [email protected] ([email protected])

  └── [email protected] ([email protected], [email protected])

  2、配置项目

  1)创建一个名为myproject的新目录

  

复制代码 代码如下:

  $ mkdir myproject

  $ cd myproject

  2)在目录下运行初始化命令

  

复制代码 代码如下:

  $ npm init

  此命令会生成package.json文件,它是项目的元数据。

  接着执行命令:

  

复制代码 代码如下:

  $ npm install --save hapi

  它会安装hapi库到项目下,并把hapi的依赖关系写入package.json。

  此时,项目开发所需的一切都已经准备完毕。

  三、开发实例

  1、创建服务器

  

复制代码 代码如下:

  // server.js

  var Hapi = require('hapi');

  var server = new Hapi.Server(3000);

  server.start(function(){

  console.log('Server running at: ', server.info.uri);

  });

  首先,我们需要Hapi库。

  其次,我们创建一个新hapi服务器对象,并把要监听的端口号传递给服务器对象。

  最后,服务器对象启动,并输出日志信息。

  要说明一点,我们创建服务器对象时,可以提供主机名、IP地址,甚至是Unix的socket文件,或者是Windows系统绑定到服务器命名的管道。

  2、启动服务器

  执行命令:

  

复制代码 代码如下:

  $ node server.js

  访问http://127.0.0.1:3000/ ,浏览器显示如下内容:

  

复制代码 代码如下:

  {"statusCode":404,"error":"Not Found"}

  很正常,因为服务器上本身就没有任何内容,下面把路由逻辑添加上。

  3、路由逻辑

  

复制代码 代码如下:

  // server.js

  var Hapi = require('hapi');

  var server = new Hapi.Server(3000);

  server.route({

  method: 'GET',

  path: '/',

  handler: function(request, reply){

  reply('Hello, world!');

  }

  });

  server.route({

  method: 'GET',

  path: '/{name}',

  handler: function(request, reply){

  reply('Hello, ' + encodeURIComponent(request.params.name) + "!");

  }

  });

  server.start(function(){

  console.log('Server running at: ', server.info.uri);

  });

  再次启动服务器:

  

复制代码 代码如下:

  $ node server.js

  并访问http://127.0.0.1:3000/ ,浏览器显示如下内容:

  Hello, world!

  访问http://127.0.0.1:3000/张三 ,浏览器显示如下内容:

  Hello, %E5%BC%A0%E4%B8%89!

  可见,路由逻辑运行正常。

  要注意:

  method的参数可以是任意有效的HTTP方法,也可以是星号*(表示任意HTTP方法)。

  path的参数定义了访问路径,路径可以包含参数、可选参数,甚至是通配符。

  四、使用插件

  在创建Web应用时,通常我们都需要访问日志。要为应用程序添加基本的日志输出,我们可以在服务器上加载good插件。

  1、安装good插件

  

复制代码 代码如下:

  $ sudo npm install --save good

  [email protected] node_modules/good

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected]

  ├── [email protected] ([email protected])

  └── [email protected] ([email protected], [email protected])

  2、更新server.js的代码

  

复制代码 代码如下:

  // server.js

  var Hapi = require('hapi');

  var Good = require('good');

  var server = new Hapi.Server(3000);

  server.route({

  method: 'GET',

  path: '/',

  handler: function(request, reply){

  reply('Hello, world!');

  }

  });

  server.route({

  method: 'GET',

  path: '/{name}',

  handler: function(request, reply){

  reply('Hello, ' + encodeURIComponent(request.params.name) + "!");

  }

  });

  server.pack.register(Good, function(err){

  if(err){

  // something bad happened loading the plugin

  throw err;

  }

  server.start(function(){

  server.log('info', 'Server running at: ' + server.info.uri);

  });

  });

  运行server.js,控制台输出:

  

复制代码 代码如下:

  141102/161007.644, info, Server running at: http://localhost:3000

  如果我们接着访问:http://127.0.0.1:3000/liqiang

  和http://127.0.0.1:3000/

  控制台会继续输出:

  

复制代码 代码如下:

  141102/161150.689, request, http://Thinker-LQ:3000: get /liqiang {} 200 (37ms)

  141102/161155.812, request, http://Thinker-LQ:3000: get / {} 200 (4ms)