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


Posted in Javascript onJanuary 14, 2015

一、HapiJS介绍

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

二、HapiJS安装和项目配置

1、安装Hapi库
HapiJS的安装很简单,执行如下命令:

$ sudo npm install hapi -g

hapi@7.2.0 /usr/local/lib/node_modules/hapi

├── cryptiles@2.0.4

├── heavy@1.0.0

├── topo@1.0.2

├── accept@1.0.0

├── items@1.1.0

├── kilt@1.1.1

├── catbox-memory@1.1.0

├── boom@2.5.1

├── qs@2.2.4

├── call@1.0.0

├── statehood@1.2.0

├── h2o2@2.0.1

├── iron@2.1.2

├── shot@1.3.5

├── glue@1.0.0

├── wreck@5.0.1

├── hoek@2.8.0

├── catbox@4.0.3

├── vision@1.1.0

├── mimos@1.0.0 (mime-db@1.1.1)

├── rejoice@1.0.0 (bossy@1.0.2)

├── inert@1.1.0 (lru-cache@2.5.0)

├── joi@4.7.0 (isemail@1.1.1)

└── subtext@1.0.1 (content@1.0.1, pez@1.0.0)

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

good@3.1.1 node_modules/good

├── json-stringify-safe@5.0.0

├── good-reporter@2.0.0

├── async@0.9.0

├── hoek@2.8.1

├── moment@2.8.3

├── good-file@2.0.0 (items@1.1.0)

└── joi@4.7.0 (topo@1.0.2, isemail@1.1.1)

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)
Javascript 相关文章推荐
jQuery+CSS 半开折叠效果原理及代码(自写)
Mar 04 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
Aug 21 Javascript
javascript实现的猜数小游戏完整实例代码
May 10 Javascript
AngularJS中$watch和$timeout的使用示例
Sep 20 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
Oct 01 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
vue实现点击隐藏与显示实例分享
Feb 13 Javascript
vue项目中仿element-ui弹框效果的实例代码
Apr 22 Javascript
vue回到顶部监听滚动事件详解
Aug 02 Javascript
javascript中可能用得到的全部的排序算法
Mar 05 Javascript
javascript的var与let,const之间的区别详解
Feb 18 Javascript
jQuery中Ajax的load方法详解
Jan 14 #Javascript
jquery获取当前日期的方法
Jan 14 #Javascript
JavaScript 学习笔记之基础中的基础
Jan 13 #Javascript
jQuery 中DOM 操作详解
Jan 13 #Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 #Javascript
jQuery过滤选择器详解
Jan 13 #Javascript
jQuery入门介绍之基础知识
Jan 13 #Javascript
You might like
菜鸟修复电子管记
2021/03/02 无线电
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
PHP之短标签开启设置
2013/06/17 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
Selenium定位元素操作示例
2018/08/10 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
初婚未育证明样本
2014/10/24 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
撤诉状格式范本
2015/05/19 职场文书
亮剑观后感
2015/06/05 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android