TypeScript中如何使用AWS Eventbridge Schema Registry的Marshaller
EventBridge Schema Registry TypeScript
Marshaller 使用指南 你下载的官方code bindings已经内置了所有类型映射关系,不需要手动硬编码任何类型标识字符串,两个核心方法的调用规则和type参数传法如下:
unmarshal(input: unknown)
用于反序列化校验:入参直接传你从EventBridge接收到的原始事件对象(比如Lambda触发时传入的完整事件结构),不需要传第二个参数。方法会自动读取事件内置的Schema元信息做匹配,返回经过类型校验的强类型事件对象,字段类型、必填项不匹配时会直接抛出校验错误。marshall(data: any, type: string)
用于序列化构造合规事件:把你业务代码里构造的事件对象,转换成符合Schema规范、可以直接传入EventBridgePutEvents接口的标准格式。这里的type参数禁止手动自定义字符串,code bindings包会为每个注册的Schema自动导出对应的TYPE_NAME常量,直接导入使用即可。
实际调用示例
假设你在注册表中创建了com.mycompany.order@MyOrderCreatedEvent的Schema,下载绑定后代码结构如下:
// 1. 导入依赖和自动生成的绑定内容 import { Marshaller } from '@aws/eventbridge-sdk-marshaller'; // 注意这里的TYPE_NAME是绑定包自动生成的,和Schema一一对应,不需要自己修改 import { MyOrderCreatedEvent, TYPE_NAME as ORDER_CREATED_EVENT_TYPE } from './schemas/com/mycompany/order/MyOrderCreatedEvent'; // 2. 初始化Marshaller实例,全局复用即可 const marshaller = new Marshaller();
marshall 正确调用示例
// 构造业务事件,TS会自动做类型提示和静态校验 const newOrderEvent: MyOrderCreatedEvent = { orderId: 'ord_20240520_001', payAmount: 129.9, createTimestamp: new Date().toISOString(), buyerId: 'u_10086' }; // 第二个参数直接传入绑定包导出的TYPE_NAME常量 const putEventEntryDetail = marshaller.marshall(newOrderEvent, ORDER_CREATED_EVENT_TYPE); // 生成的putEventEntryDetail是序列化后的JSON字符串,可以直接作为PutEvents接口的Detail参数传入
unmarshal 正确调用示例
// 以Lambda接收到的EventBridge原始事件为例 const rawEvent = { version: '0', id: 'event-id-xxxx', 'detail-type': 'MyOrderCreatedEvent', source: 'com.mycompany.order', account: '123456789012', time: '2024-05-20T08:30:00Z', region: 'cn-north-1', resources: [], detail: { orderId: 'ord_20240520_001', payAmount: 129.9, createTimestamp: '2024-05-20T08:30:00Z', buyerId: 'u_10086' } }; // 直接传入原始事件即可,无需额外传参 const validOrderEvent = marshaller.unmarshal(rawEvent) as MyOrderCreatedEvent; // validOrderEvent就是经过运行时校验的类型安全对象,可直接读取字段使用
注意:不要手动硬编码
type参数字符串(比如自己写"MyOrderCreatedEvent"传入),自动生成的TYPE_NAME常量包含Schema对应的命名空间、版本等完整匹配信息,手动传值很容易因为标识不匹配导致序列化失败、校验不通过。
内容的提问来源于stack exchange,提问作者Will Zefeng Qiu
相关产品推荐
相关产品推荐

