NodeJS入门 0xA Node的Web开发(2)服务器端框架(2)

156 阅读4分钟

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 的处理方式,可能很难将数据库模式调整为符合它的要求的样子。