Manba项目中的JavaScript插件开发指南
manba HTTP API Gateway 项目地址: https://gitcode.com/gh_mirrors/ma/manba
引言
在现代API网关设计中,动态扩展能力是一个关键特性。Manba项目通过JavaScript插件机制,为开发者提供了强大的功能扩展能力。本文将详细介绍如何在Manba中开发和使用JavaScript插件,帮助开发者充分利用这一特性。
JavaScript插件基础
插件结构
Manba的JavaScript插件采用模块化设计,每个插件都需要遵循特定的结构:
function NewPlugin(cfg) {
// 导入内置模块
var JSON = require("json")
var HTTP = require("http")
var REDIS = require("redis")
var LOG = require("log")
// 返回插件实现
return {
// 请求预处理方法
"pre": function(ctx) {
// 业务逻辑
return {
"code": 200,
"error": "error",
}
},
// 响应后处理方法
"post": function(ctx) {
// 业务逻辑
return {
"code": 200,
"error": "error",
}
},
// 错误处理方法
"postErr": function(ctx) {
// 错误处理逻辑
}
}
}
上下文对象(Context)
插件执行时会获得一个上下文对象,提供丰富的操作方法:
核心方法
OriginRequest()
: 获取原始请求对象ForwardRequest()
: 获取转发请求对象Response()
: 获取后端响应对象SetAttr(key, value)
: 设置上下文属性HasAttr(key)
: 检查属性是否存在GetAttr(key)
: 获取属性值
HTTP请求对象(HTTPRequest)
提供完整的HTTP请求操作能力:
- 头部操作:
Header()
,SetHeader()
,RemoveHeader()
- Cookie操作:
Cookie()
,SetCookie()
,RemoveCookie()
- 查询参数:
Query()
- 请求体:
Body()
,SetBody()
HTTP响应对象(HTTPResponse)
提供完整的HTTP响应操作能力:
- 头部操作:
Header()
,SetHeader()
,RemoveHeader()
- Cookie操作:
Cookie()
,SetCookie()
,RemoveCookie()
- 状态码:
SetStatusCode()
- 响应体:
Body()
,SetBody()
内置模块详解
Manba提供了多个内置模块,弥补了JavaScript引擎的功能限制:
JSON模块
Stringify()
: 对象序列化为JSON字符串Parse()
: JSON字符串解析为对象
日志模块(LOG)
提供多级别日志记录能力:
- 信息级别:
Info()
,Infof()
- 调试级别:
Debug()
,Debugf()
- 警告级别:
Warn()
,Warnf()
- 错误级别:
Error()
,Errorf()
- 致命错误:
Fatal()
,Fatalf()
HTTP客户端模块
提供完整的HTTP请求能力:
Get()
: GET请求Post()
/PostJSON()
: POST请求Put()
/PutJSON()
: PUT请求Delete()
/DeleteJSON()
: DELETE请求
HTTP响应对象(HTTPResult)提供:
- 错误检查:
HasError()
,Error()
- 状态码:
StatusCode()
- 响应数据:
Header()
,Cookie()
,Body()
Redis模块
提供Redis操作能力:
RedisModule()
: 创建Redis连接Do()
: 执行Redis命令
Redis命令响应对象(CmdResp)提供多种结果转换方法:
StringValue()
: 字符串结果StringsValue()
: 字符串数组结果IntValue()
/IntsValue()
: 整型结果Int64Value()
/Int64sValue()
: 长整型结果
插件方法详解
pre方法
在请求转发到后端前执行,可用于:
- 请求验证
- 请求修改
- 直接响应
关键特性:
- 可通过返回
BreakFilterChainCode
终止后续插件执行 - 可使用
UsingResponse
属性直接返回响应
"pre": function(ctx) {
var HTTP = require("http")
var resp = HTTP.NewHTTPResponse()
resp.SetStatusCode(200)
resp.SetBody('{"status":"ok"}')
ctx.SetAttr("UsingResponse", resp.Delegate())
return {"code": "BreakFilterChainCode"}
}
post方法
在收到后端响应后执行,可用于:
- 响应修改
- 响应验证
- 数据转换
postErr方法
在后端请求失败时执行,可用于:
- 错误处理
- 降级响应
- 错误日志记录
最佳实践
- 性能优化:在插件初始化阶段(
NewPlugin
)完成资源密集型操作 - 错误处理:合理使用
postErr
方法处理后端错误 - 日志记录:使用LOG模块记录关键操作
- 状态管理:利用上下文属性在插件方法间传递数据
- 资源释放:对于Redis等资源,注意连接管理
总结
Manba的JavaScript插件机制为API网关提供了强大的扩展能力。通过本文的介绍,开发者可以充分利用pre/post/postErr方法、上下文对象和各种内置模块,实现复杂的业务逻辑,如鉴权、限流、数据转换等功能。合理设计插件可以显著提升API网关的灵活性和功能性。
manba HTTP API Gateway 项目地址: https://gitcode.com/gh_mirrors/ma/manba
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考