Skip to content
/ foi Public

基于 Serverless 架构的 Node.js Web 开发框架,提供和 Koa 一致的 API,可跨云平台使用。

License

Notifications You must be signed in to change notification settings

inlym/foi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

foi

基于 Serverless 架构的 Node.js Web 开发框架,提供和 Koa 一致的 API,可跨云平台使用。

GitHub:https://github.com/inlym/foi

欢迎 star

简介

foi 是一款基于 Serverless 架构的 Node.js Web 开发框架,提供和知名框架 Koa 一致的 API,可跨云平台使用。严格意义上来说,foi 并不是一个完整的框架,只是提供了一个方便开发 Serverless 应用的中间件。foi 主要做了以下两项工作:

  1. 统一对接各大云平台的 Serverless 实现
  2. 将封装好的 API 以 Koa 框架风格的 API 输出供开发者使用

用以下的架构图表示 foi 的功能:

优点

跨多云平台

各云平台(阿里云、腾讯云、华为云、AWS等)对于 Serverless 的实现存在一定的差异,使用上也存在很大的差异,foi 针对各云平台的 API 做了兼容,使开发者在使用时无需阅读各云平台的开发文档,直接以 Koa 的 API 开发即可。foi 使得一份代码能够在所有云平台的 Serverless 架构服务上部署和运行。

低迁移成本

从 Koa 框架迁移至 foi 框架,只需要更改 2 行代码即可使用。这里面 foi 框架做了大量的底层工作,兼容 Koa 的 API。(详情点击查看 从 Koa 迁移 foi )

另外,绝大多数的 Koa 中间件都可以在 foi 中使用。(由于 Serverless 架构限制,部分中间件无法使用。)

低学习成本

由于对开发者提供了与 Koa 一致的 API,因此开发无需额外花费时间学习 foi 本身,只需要根据文档说明对 foi 进行安装和使用即可,与 Koa 的差异仅在于初始化的 2 行代码。

安装

foi 的安装非常简单,你可以直接使用 npm 进行安装:

npm install foi

如果访问速度较慢,建议使用 cnpm 安装:(如需查看 cnpm 的安装方式,请 点击 )

cnpm install foi

使用

hello world

以下是一个输出响应(response)的主体为 'hello world' 的典型使用方式:

'use strict'
const Foi = require('foi')

// Serverless 架构结构体
module.exports.handler = function (event, context, callback) {
	// 初始化 app
	const app = new Foi({ event, context, callback })

	// 主体部分使用 app.use, 和 Koa 一致的 API
	app.use(ctx => {
		ctx.body = 'hello world'
	})

	// 假的 listen, 兼容 Koa, 建议使用 app.init()
	app.listen()
}

你可以看出,在使用上,和 Koa 几乎没有任何区分,Koa 中在 app.use( ) 中使用的代码,均能在 foi 中运行。

初始化选项

初始化的标准格式是:

const app = new Foi(options)    // options 是一个对象

针对不同的云平台和触发器,对应的 options 参数略有不同,其中包含了一些公共参数,和一些触发器的私有参数。

公共参数

const options = {
	slient: false,    // 是否禁止打印 foi 框架日志,默认 false,可选
	trigger: 'aliyun-apigw',    // 触发器,阿里云API网关触发器为'aliyun-apigw'
}

阿里云 - API网关

const options = {
	evnet: event,
	context: context,
	callback: callback,    // Serverless 传入的三要素,注意这里的属性值要和定义的变量名一致
}

配置

由于框架限制,部分参数需要在云平台进行配置才可以获取到。请按照你使用的触发器进行配置。

阿里云 - API网关

(1)路径参数 - params 通过以下方式配置后,你可以使用 ctx.params 获取路径参数对象

(2)其他参数 - ip, host, protocol 要获取 ip, host, protocol 参数,请在API网关处进行如下配置,否则会获取不到对应参数。

从 Koa 迁移 foi

迁移方式

从以上的使用方式看出,最核心的 app.use( ) 不需要改动。我们先来看一个最普通的 Koa 框架应用:

'use strict'

const Koa = require('koa')

const app = new Koa()

app.use(ctx=>{
	ctx.body = 'hello world'
})

app.listen(80)

只要改动2处,就可以迁移至 foi : (1)变更引用模块

const Koa = require('koa')

变更为

const Foi = require('foi')

(2)变更初始化方式

const app = new Koa()

变更为

const app = new Foi({event, context, callback})

总共只需改动以上 2 行代码,以下部分为 Serverless 附加的代码:

module.exports.handler = function(event, context, callback){

}

中间件兼容情况

foi 兼容 Koa 框架的绝大多数中间件,但以下2类中间件不支持:

  1. 中间件承载的功能已经封装在 foi 框架里面了,例如 koa-bodyparser 中间件,可以直接通过 ctx.request.body 获取 body 请求的 body 内容。
  2. 基于“流”的中间件,更准确地讲,foi 不支持基于 Koa 的 req 和 res 对象的绝大多数中间件。(在 foi 实现中,屏蔽的原生的 req 和 res,虽然仍然能够使用 req 和 res,但这只是作为 request 和 response 的别名)

框架 foi 和 midway比较

midway 是阿里云自研的 Node.js Web 开发框架,能够实现 foi 的所有功能。两者的差异非常大,举一个例子,如果说 foi 类比于 jQuery 的话,可以将 midway 类比为 Angular + Typescript + Webpack + Node.js + NPM。

foi 仅作为一个非浸入式开发的工具库,而 midway 提供了用于 Serverless 开发的一整套工具链。

以下是 foi 和 midway 的对比:

foi midway
统一对接各云平台接口 支持 支持
提供和 Koa 一致的 API 支持 支持
学习成本 非常低 非常高
自动化部署 不支持 支持
开发工具链 丰富

支持情况

各云平台触发器的支持情况:

云平台 触发器 触发器名称 支持情况
阿里云 API网关触发器 aliyun-apigw 已支持
阿里云 HTTP触发器 aliyun-http 开发中
腾讯云 API网关触发器 qcloud-apigw 开发中
华为云 API网关触发器 huawei-apigw 开发中
百度智能云 API网关触发器 baidu-apigw 开发中
AWS API网关触发器 aws-apigw 开发中

About

基于 Serverless 架构的 Node.js Web 开发框架,提供和 Koa 一致的 API,可跨云平台使用。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published