Manba项目中的JavaScript插件开发指南

Manba项目中的JavaScript插件开发指南

manba HTTP API Gateway manba 项目地址: 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方法

在后端请求失败时执行,可用于:

  • 错误处理
  • 降级响应
  • 错误日志记录

最佳实践

  1. 性能优化:在插件初始化阶段(NewPlugin)完成资源密集型操作
  2. 错误处理:合理使用postErr方法处理后端错误
  3. 日志记录:使用LOG模块记录关键操作
  4. 状态管理:利用上下文属性在插件方法间传递数据
  5. 资源释放:对于Redis等资源,注意连接管理

总结

Manba的JavaScript插件机制为API网关提供了强大的扩展能力。通过本文的介绍,开发者可以充分利用pre/post/postErr方法、上下文对象和各种内置模块,实现复杂的业务逻辑,如鉴权、限流、数据转换等功能。合理设计插件可以显著提升API网关的灵活性和功能性。

manba HTTP API Gateway manba 项目地址: https://gitcode.com/gh_mirrors/ma/manba

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廉娴鹃Everett

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值