hapi
hapi 是个服务器框架,它的重点是 Web API 的开发。 hapi 有自己的插件 API,完全没有客户端支持,也没有数据模型层。 hapi 有路由 API 和它自己的 HTTP 服务器封装。在 hapi 中设计 API,要把服务器当作主抽象。从 DevOps 的观点来看, hapi 自带的连接和日志功能使得它易于扩展和管理。
设置
创建项目
mkdir listing5_2
cd listing5_2
npm init -y
npm install --save hapi@13.3.0
//server.js
const Hapi = require('hapi');
const server = new Hapi.Server();
server.connection({
host:'localhost',
port:8000
});
server.start((err)=>{
if(err){
throw err;
}
console.log('Server running at:',server.info.uri);
});
定义路由
hapi 有创建路由的 API。要创建路由,必须提供一个包含请求方法、 URL 和回调函数的对象,其中的回调函数就是路由处理器。
const Hapi = require('hapi');
const server = new Hapi.Server();
server.connection({
host:'localhost',
port:8000
});
server.route({
method:'GET',
path:'/hello',
handler:(request,reply)=>{
return reply('hello hapi')
}
});
server.start((err)=>{
if(err){
throw err;
}
console.log('Server running at:',server.info.uri);
});
插件
hapi 有自己的插件架构,并且大部分项目都需要靠插件完成认证和输入校验等功能。 inert是大多数项目都需要的简单插件,它提供了静态文件和目录处理器。
npm install --save inert@3.2.0
const Inert = require('inert');
server.register(Inert,()=>{});
server.route({
method:'GET',
path:'/{param*}',
handler:{
directory:{
path:'.',
redirectToSlash:true,
index:true
}
}
});
REST API
hapi 支持 HTTP 动词和 URL 参数化,允许用标准的 hapi 路由 API 实现 REST API。
server.route({
method:'DELETE',
path:'item/{id}',
handler:(req,reply)=>{
//基于req.params.id删除
reply(true);
}
});
优点
hapi 的插件 API 是它最大的优势。插件不仅能扩展 hapi 的服务器,还可以添加各种各样的功能,比如数据校验和模板等。另外,由于 hapi 是基于 HTTP 服务器的,所以适合用在某些部署场景中。如果要部署很多相互连接的服务器,或者需要做负载均衡时, hapi 基于服务器的 API 可能比 Express 或 Koa 好用。
弱点
hapi 的弱点跟 Express 一样:极简,所以对项目结构没有把控。我们永远也不知道哪个插件的开发会停下来,所以过于依赖插件可能会造成将来难以维护。
Sails.js
这是一个模型视图控制器框架。 Sails 有一个跟数据库协同作用的对象关系映射(ORM)库,还能自动生成 REST API。它支持 WebSocket 等现代化的功能。如果你喜欢用 React 或 Angular,应该会很高兴它是前端无关的: Sails 不是全栈框架,所以可以跟任何前端库或框架配合使用。
设置
Sails 有项目生成器,所以最好是全局安装,这样创建新项目会更轻松。
npm install -g sails
sails new example-project
定义路由
Sails 中将路由称为定制路由,打开 config/routes.js,在输出的路由中添加新的属性即可添加路由。属性的格式是 HTTP 动词加上部分 URL。
/**
* Route Mappings
* (sails.config.routes)
*
* Your routes tell Sails what to do each time it receives a request.
*
* For more information on configuring custom routes, check out:
* https://sailsjs.com/anatomy/config/routes-js
*/
module.exports.routes = {
/***************************************************************************
* *
* Make the view located at `views/homepage.ejs` your home page. *
* *
* (Alternatively, remove this and add an `index.html` file in your *
* `assets` directory) *
* *
***************************************************************************/
//'/': { view: 'pages/homepage' },
'get /example':{view:'example'},
//需要文件 view/example.ejs
'post /items':'ItemController.create'
//需要有 create 方法的 api/controllers/ItemController。
//运行命令 sails generate controller item create 可以生成带有 create方法的控制器。
/***************************************************************************
* *
* More custom routes here... *
* (See https://sailsjs.com/config/routes for examples.) *
* *
* If a request to a URL doesn't match any of the routes in this file, it *
* is matched against "shadow routes" (e.g. blueprint routes). If it does *
* not match any of those, it is matched against static assets. *
* *
***************************************************************************/
};
REST API
Sails 将数据库模型和控制器结合进了 API 中,可以用命令 sails generate api resourcename 生成 RESTful API。要使用数据库,首先需要安装数据库适配器。找到 Waterline MySQL 包的名字,然后把它添加到项目中:
npm install --save waterline sails-mysql
接下来,打开 config/connections.js,将 MySQL 服务器的连接信息填好。 Sails 模型文件中可以指定数据库连接,所以不同的模型可以使用不同的数据库。也就是说可以把用户会话数据放在Redis 之类的数据库中,而把需要持久保存的数据放到 MySQL 这样的关系型数据库中。
Waterline 是 Sails 的数据库系统库,除了支持多个数据库,它还能定义表和列名,以支持遗留的数据库模式。另外,它的查询 API 支持 promise,因此查询看起来很像现代化的 JavaScript。
优点
自带的项目创建和 API 生成意味着可以快速设置项目,快速添加典型的 REST API。因为Sails 项目的文件系统结构都是一样的,所以也有利于创建新项目和相互协作。 Sails 的创建者Mike McNeil 和 Irl Nathan 共同写了本书,叫 Sails in Action,书中阐述了 Sails 对 Node 新手是多么友好。
弱点
Sails 的弱点跟其他服务器端 MVC 框架一样:路由 API 意味着我们在设计程序时必须考虑到Sails 的路由特性,并且由于 Waterline 的处理方式,可能很难将数据库模式调整为符合它的要求的样子。