说明 CAP 中的事件处理
学习目标
评估何时使用事件处理器
使用场景
你的公司计划使用 SAP Cloud Application Programming Model(CAP)构建一个扩展应用。框架为标准 CRUD 操作(CREATE、READ、UPDATE、DELETE)提供的通用服务处理器无法完全满足应用的需求。你希望在标准功能之上实现自定义业务逻辑。为此,你必须理解 CAP 中事件处理器的概念。
观看视频以了解 CAP 中的事件处理器。
视频:本节含 SAP 官方视频(视频 ID
1_4ywvnu11),需在 learning.sap.com 在线观看。
介绍事件处理器的注册

选项 1
在此方法中,JavaScript 文件被放置在用于定义服务的 CDS(.cds)文件旁边;该 JavaScript 文件需要与 .cds 文件同名,这样框架就会把实现挂接到服务文件上。
选项 2
这里我们通过在 CDS 模型文件(.cds)中的 impl 注解来建立链接,并在其中指明相应服务实现所在的位置。当你使用了不同的文件名,或者你希望非常明确地表明这两个文件属于一起时,这种方式很有用。
选项 3 和 4
这些选项相当高级,与 CDS serve API 配合使用,以便自行引导(bootstrap)你的服务。
选项 5
该选项用于处理外部服务。
请求对象

请求对象会传入事件处理器。它们提供关于上下文的各种信息,例如请求数据或方法(如 get、post 等)。请求对象还用于向客户端返回错误消息,或者为请求生命周期注册另一组处理器,例如请求已完成、已成功或已失败时。
一个示例
设想一个管理你公司 IT 资产的简单应用。每个资产类别都有一个实体——例如 Notebooks、Phones、Tablets。这些实体通过一个 inventory 服务对外暴露。该服务提供一个 OData API,使你能够与这些实体进行交互。假设你想查看笔记本的当前库存。你向 inventory/Notebooks 服务执行一个 GET 请求。在 CAP 内部,会为 Notebooks 实体触发一个 READ 事件。有一个内置的事件处理器(也称为通用提供者),它在 Notebooks 实体的 READ 事件上从数据库检索所请求的数据。
使用事件处理器
CAP 开箱即用地处理所有 CRUD 事件(CREATE、READ、UPDATE、DELETE)。在定义实体和服务之后,你无需采取任何进一步的步骤。然而,标准功能往往无法满足你的全部需求。你希望实现自定义逻辑。在这些情况下,你可以使用 CAP Service SDK for Node.js 的处理器注册 API。
扩展上面的示例
假设你在你的 inventory 服务之上构建了一个 UI。它显示某个设备是否符合更换条件。设备是否符合更换条件取决于设备类型、采购日期或国家——因此没有简单的答案。你的服务必须把它找出来。在你的实体中有一个布尔字段 eligible_for_replacement,默认设置为 false。
每当你的 inventory 服务中任何实体发生 READ 事件时,在实体被读取之后,你希望有一个自定义事件处理器来判断各个设备是否符合更换条件。它可能如下所示:
cds.serve('inventory-service') .with (function(){
this.after('READ', '*', (devices)=>{
for (let each of devices) {
var deviceAge = calculateDeviceAgeYears(each)
if (deviceAge >= 4) {
each.eligible_for_replacement = true
} else {
each.eligible_for_replacement = false
}
} })
})
该代码定义了在 inventory 服务中任何()实体每次 READ 之后,都会计算是否符合更换条件。该方法会遍历通用服务处理器所获取数据的每一行。请注意,除了为任何实体()注册处理器方法之外,你也可以为特定实体注册事件处理器——例如 Notebooks。
在这个简单的示例中,是否符合更换条件仅取决于设备的机龄,但你可以理解到,在这里几乎一切皆有可能。
事件阶段
事件分三个阶段依次连续执行:Before、On 和 After。注册事件处理器时,必须指定在哪个阶段调用该事件处理器。在前面的示例中,处理器方法被指定用于 After 阶段。可以为每个事件阶段注册多个事件处理器。同样,单个处理器也可以处理多个事件。
对于外部服务,框架无能为力,因此你必须提供一个 'on' 处理器,但你也可以使用 'on' 钩子来覆盖通用 CRUD 处理器。不过,建议使用通用实现,只有在需要不同逻辑时才偏离它。
总结
你现在可以说明 CAP 中事件处理器的概念了。
此外,你还能够评估是否需要自定义事件处理器,并且能够执行自定义事件处理器的基本实现。
延伸阅读
有关更多信息,请查阅以下内容:
Event Handling
CAP Service SDK for Node.js