Feathers:一个创建实时应用和REST API的轻量级框架

2020-02-01大约21分钟

Feathers是一个轻量级 Web 框架,使用这个框架,您就可以使用 JavaScript 或 TypeScript 来创建实时应用程序和 REST API。虽然是一个基于JavaScript的框架,但Feathers 可以与任何后端技术进行交互,支持十多个数据库,并与任何前端技术(如 React、VueJS、Angular、React Native、Android或者iOS)配合使用。

图片

今天之所以跟大家介绍这个框架,是因为这个框架有一系列显著的优点:

1. 针对JavaScript/TypeScript语言的一个API的框架

随着微服务的日益普遍,大家开发新的API的时候,已有的产品、平台所使用的技术就变得不是那么决定性的了,大家可以考虑一些更轻量、开发起来更快、执行效率更高的一些框架。而很多API都有一个相同的特点,其中一个就是大多数逻辑都是从数据库、或向其他服务请求数据,然后经过或多或少的数据处理、转换之后,把结果返回API的调用者。这类API,使用的CPU计算资源不多,但使用的I/O资源、I/O等待一般会很多,这种情况下,实现一个异步的API是比较高效的选择。而Node.js刚好简单、优雅地满足了这个要求,单进程、I/O都默认是异步的等等特性,使得用JavaScript/TypeScript开发API变得非常自然。

其他的语言,如Java、.Net、Python等都有成熟的API的框架,JavaScript虽然也有,但主流的如Express.jsKoa.jsHapi.js等等框架,却主要面向的都是提供传统Web页面网站的开发,而不是专门针对API,尤其是针对RESTful风格的API的框架。

什么是RESTful风格的API呢?粗略来说,用Feathers的举例子来看,大概像这样:

class CourseService {
  async find(params) {}
  async get(id, params) {}
  async create(data, params) {}
  async update(id, data, params) {}
  async patch(id, data, params) {}
  async remove(id, params) {}
}

app.use('/courses', new CourseService());

API的URL/courses,表示一个资源,而对应的服务,则只需要实现HTTP标准的几个方法:

  • GET: 读取或查找,对应上面例子中的getfind操作
  • POST: 创建,对应上面例子中的create操作
  • PUT: 修改,对应上面例子中的update操作
  • PATCH: 修改部分,对应上面例子中的patch操作
  • DELETE:删除,对应上面例子中的remove操作

也就是说,只要实现了对应的findgetcreate等方法,那么:

  • 对于开发者个人来说,完全不需要再费心思为每一个方法生成一个API的URL,也不需要去实现HTTP请求handler、method映射等代码;
  • 对于团队来说,每个人只需要实现自己的Service里面对应的findget等方法,实现完成之后,大家的设计都容易保证是符合RESTful风格的,易于后期修改维护;

所以,如果框架直接支持了RESTful风格的API开发,那么开发起来是非常容易、快速的。

2. 功能强大

Feathers的强大功能体现在很多方面。

1)支持用Socket.io建立双向、基于事件的实时service调用服务。 不管是支持RESTful,还是实时的服务,Service的实现都是一样的,唯一的只是在传入层的配置不一样。具体文档参考这里

2)每个Service和每个方法都可以添加hook。 hook是service的middleware,通常用于处理诸如验证、授权、日志记录、填充相关实体、发送通知等事项,并且这是跟传入层无关的。

用法举例:

const createdAt = async context => {
  context.data.createdAt = new Date();
  return context;
};

app.service('messages').hooks({
  before: {
    create: [ createdAt ]
  }
});

3)提供常见的数据库的适配器。 提供的范围很广泛,比如PostgreSQL, MySQL, MariaDB, Oracle、SQLite3、MongoDB、SQL Server等数据库。更为强大的是,一旦用了feathers提供的数据库适配器,那么很多常见的一些数据库操作,比如增删查改、分页等都不需要自己再写额外的代码了。举个例子:

const service = require('feathers-<db-name>');

// Set the `paginate` option during initialization
app.use('/todos', service({
  paginate: {
    default: 5,
    max: 25
  }
}));

// override pagination in `params.paginate` for this call
app.service('todos').find({
  paginate: {
    default: 100,
    max: 200
  }
});

// disable pagination for this call
app.service('todos').find({
  paginate: false
});

当然,有些情况下也还是需要自己写一些代码,这种情况也还是可以复用feathers提供的功能的。

4)提供常见的工具、可复用的hooks等码。 不管是初始化一个项目结构性代码,还是常见的用户认证,还是常见的公用的hooks,都有提供。比如这个是feathers生态里常见的hooks和一些工具方法

3. 简单轻量。

Feathers不像Express之类框架,虽然Express是个非常优秀的框架,有非常大的用户群,但Express是一个通用型的框架,虽然也很轻量,但往往做一个项目的时候,很多东西都需要自己从头搭,尤其是实现一个web服务API的时候,自己要做的东西就更多了。而Feathers则专注于API这一块儿,可以帮助我们用行业的最佳实践和模式,让自己专注于提供业务本身的代码,从而快速地让自己的项目健康、快速地运行起来。有车子了,为什么还要再自己造轮子呢?

说到这里,是不是有点心动了呢?具体用法无法在一篇文章说清,要用的话,还是需要看官方文档:

https://docs.feathersjs.com/

https://hooks-common.feathersjs.com/hooks.html