使用Edge函数为多个端点提供服务

IMPORTANT
AEM Edge函数当前为测试版。 功能和文档可能会更改。 如需反馈,请联系aemcs-edgecompute-feedback@adobe.com

一个AEM Edge函数可以公开多个HTTP端点。 生成API终结点中的示例已在单个JavaScript函数上显示两个终结点(/status/my-api)。 您​ 不是为每个终结点 ​部署单独的函数,而是向同一函数添加终结点匹配逻辑。

要点

图层
什么比例
edgeFunctions.yaml
一个名称为的函数声明,例如my-edge-function
cdn.yaml
每个端点​有一个源选择器规则,所有规则共享相同的(例如,edgefunction-my-edge-function)源,但每个规则都有自己的路径匹配规则
index.js
每个终结点​有一个if语句,并且语句正文有自己的处理程序逻辑

如何添加另一个端点

要公开新终结点,如/api/items,请执行以下操作:

  1. src/index.js中添加终结点匹配逻辑。
  2. 构建和部署AEM Edge功能。
  3. config/cdn.yaml中为终结点添加起源选择器规则。
  4. 部署CDN配置

如何组织处理程序逻辑

index.js的焦点放在终结点匹配上。 在API增长时将处理程序逻辑移动到单独的文件中。

src/
├── index.js          # fetch event handler and endpoint matching
├── my-api.js         # handler for /my-api
├── items.js          # handler for /api/items
└── lib/
    └── response.js   # shared 404 and 500 helpers

匹配方法或路径前缀

端点匹配是纯JavaScript。 不限于路径完全相等。

HTTP方法:​处理GETPOST,位于同一路径上,具有单独的if语句。

if (url.pathname === "/api/items" && req.method === "GET") {
  return await listItems(req);
}

if (url.pathname === "/api/items" && req.method === "POST") {
  return await createItem(req);
}

路径前缀:​将相关端点分组到一个共享前缀下,然后调度到路由器模块内的处理程序。

// src/index.js
if (url.pathname.startsWith("/api/")) {
  return await apiRouter(req, url);
}
// src/api-router.js
async function apiRouter(req, url) {
  // match the segment after the shared /api/ prefix
  switch (url.pathname) {
    case "/api/items":
      return await itemsHandler(req);
    case "/api/orders":
      return await ordersHandler(req);
    default:
      return new Response("Not found", { status: 404 });
  }
}

export { apiRouter };

使前缀路由器保持简略,即一个前缀级别直接调度到处理程序。 如果前缀增大,请将其拆分为单独的前缀,并使用它们自己的原始选择器规则(例如,/api/catalog//api/checkout/),而不是在一个前缀下嵌套路由器。

更多代码示例

AEM Edge函数样板在一个函数中提供了多个端点:

示例
文件
它显示的内容
端点匹配
src/index.js
一个获取事件处理程序中的多个路径
CDN规则
config/cdn.yaml
每个端点一个源选择器规则
处理程序模块
src/weather.js
index.js提取的逻辑

其他资源

recommendation-more-help
experience-manager-learn-help-cloud-service