foi
基于Serverless架构API网关触发器Web开发框架,让你轻松处理请求和发送响应,可跨平台使用。
简介
foi 是一款小巧易用的基于Serverless架构API网关触发器的Web开发框架,通过使用 foi ,你可以更优雅地开发Serverless应用。虽然各个云计算平台(例如阿里云、腾讯云等)对Serverless都有不同的实现,体现在各入口参数的不同,你不必因此担心,foi 将帮助你抹平各云计算平台FaaS服务之间的差异,让你的一套代码,可以到处运行。
优点
-
完美支持Serverless服务的API网关触发器的相关事件,简单易用
-
相比原生写法,使用 foi 后,能够大大减少开发工作量
-
兼容从Koa框架迁移Serverless服务,只需要改动几行代码就可以适配
支持平台
目前 foi 已支持以下云计算平台的Serverless服务:
安装
foi 的安装非常简单,你可以直接使用npm安装:
npm install foi
如果访问速度较慢,建议使用cnpm安装:(如需查看cnpm的安装方式,请点击 )
cnpm install foi
使用
引用
使用前,首先进行引用:
const Foi = require('foi')
初始化
方式一(推荐)
直接使用解构语法获取 request 和 response 对象:
const { request, response } = new Foi(event, context, callback)
同时也支持以下别名方式(建议使用别名,更简短):
const { req, res } = new Foi(event, context, callback)
方式二
直接获取 app 对象,以属性的方式使用 request 和 response 对象:
const app = new foi(event, context, callback)
app.request
app.response
同理,方式二也支持 req 和 res 别名。
const app = new foi(event, context, callback)
app.req
app.res
使用方式
你可以像使用普通对象那样使用 request 对象和 response 对象,使用它的属性和方法,例如可以使用 request.method 获取请求方法,使用 response.body='abc' 设置响应主体,等等。最终使用 response.send() 发送响应。
request.method
response.body='abc'
response.send()
完整的属性和方法请查看以下的请求对象(request)和响应对象(response)。
请求对象(request)
属性
request 对象用于接收API网关的入参。包含以下参数:
| method | string | 请求方法 | 'GET' |
| headers | object | 请求头 | {"user-agent":"Mozilla/5.0","accept-language":"zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7"} |
| protocol | string | HTTP协议 | 'HTTP' |
| host | string | 请求域名 | 'api.inlym.com' |
| url | string | 请求url | '/path/to?name=mark&age=19' |
| path | string | 请求路径 | '/path/to' |
| pathParams | object | 请求路径参数 | {"post_id":123} |
| query | object | 请求查询对象 | {"name":"mark","age":19} |
| querystring | string | 请求查询字符串 | 'name=mark&age=19' |
| body | string | 请求主体 | 'abc' |
| ip | string | 请求客户端的IP地址 | '1.2.3.4' |
| id | string | 请求id,由API网关提供 | 'FDB8CDF8-8DD8-425E-8944-FD9A675B9E0E' |
备注:
-
为正常使用,以下参数需要在API网关设置,设置方式见下述 使用须知:
-
query、pathParams等参数按需设置透传或映射。
-
为保证兼容性,所有的header头将转换成小写字符。
-
严格来讲,这里的url实际上应是path,为保持兼容性,因此使用url来表示。
-
严格来讲,这里的path实际上应是pathname,为保持兼容性,因此使用path来表示。
以下属性不常用,但也提供了支持:
| rawBody | buffer | buffer形式的请求主体,常用于图片类请求 | Buffer(3) [97, 98, 99] |
以下属性不建议使用,可用于调试:
| rawHeaders | object | 由API网关传入,未做任何处理的原始请求头 | {"User-Agent":"Mozilla/5.0","Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7"} |
方法
获取请求头字段field(不区分大小写)
req.getHeader('Content-Type')
设置请求头字段field的值为value
req.setHeader('Content-Type') = 'image/png'
移除请求头字段field
req.removeHeader('Content-Type')
别名支持
考虑到部分开发者的使用习惯,同时支持以下别名,使用别名和参数名具有完全一致的效果,您无须考虑使用别名引起的兼容性问题。
属性别名:
| headers | header |
| body | data |
| rawBody | rawData |
| query | queries, param, params, queryParams, queryParameters |
| ip | clientIp, client_ip |
| path | pathname |
| pathParams | pathParameters |
方法别名:
| getHeader | get |
| setHeader | set |
| removeHeader | remove |
响应对象(response)
属性
response 的包含以下属性:
| statusCode | number | 请求方法 | 200 |
| statusMessage | string | 状态消息 | 'OK' |
| headers | object | 响应头 | {"content-type": "application/octet-stream"} |
| body | any | 请求主体 | 'abc' |
| isBase64Encoded | boolean | 是否被base64编码 | false |
方法
注意:以下所列举方法均可对属性直接赋值来设置,当前版本两种使用方式无任何区别,但为了后续版本的拓展性,建议使用以下方法进行设置。
获取响应头字段field(不区分大小写)
res.getHeader('Content-Type')
设置响应头字段field的值为value
res.setHeader('Content-Type') = 'image/png'
移除响应头字段field
res.removeHeader('Content-Type')
res.setCode(code)
设置响应状态码
res.setCode(200)
res.setMessage(msg)
设置响应状态消息
res.setMessage('OK')
res.setBody(body)
设置响应body
res.setBody('abc')
res.send(data)
发送响应,若包含data,将替换body
res.send()
res.send('abc')
别名支持
同样考虑到部分开发者的使用习惯,同时支持以下别名,使用别名和参数名具有完全一致的效果,您无须考虑使用别名引起的兼容性问题。
| statusCode | code, status |
| statusMessage | message, statusText |
| headers | header |
| setBody | setData |
| body | data |
| send | end |