最近更新时间:2024.04.09 14:14:16
首次发布时间:2023.02.15 19:04:53
本文介绍FetchEvent API的用法和示例,详细定义及用法参见MDN官方文档FetchEvent。
waitUntil 函数用于通知边缘函数等待所有该函数注册的 Promise 被处理完成后再回收请求上下文,从而延长事件处理的生命周期。默认情况下,请求响应处理完毕后,请求上下文会自动被回收。如果你的Promise中没有使用await
关键字,那么存在一种风险,即Promise可能在请求上下文被回收之前尚未执行完成。
// 定义上传日志的URL const uploadURL = "https://log-collection.com/"; // 异步函数,用于上传回复的耗时 async function uploadLog(waiter) { const start = Date.now(); // 等待waiter promise结束,这表示请求的回复已经发送完成 await waiter; // 记录结束时间,注意,边缘函数的时钟与4ms对齐,这是为了规避side-channel attack const end = Date.now(); const cost = (end - start); await fetch(uploadURL, {method : "POST", body : {"cost" : ${cost}} }); } // 监听fetch事件,并在事件发生时,调用handle函数处理 addEventListener('fetch', (event) => { event.respondWith(handle(event)); }); // 处理事件的函数 async function handle(event) { const response = new Response("Hello World"); // response.body是一个readablestream,边缘函数的实现自带了waitClose函数 // waitClose返回一个promise,当stream被终止的时候(可能是因为出错或者读取完成),waitClose会被resolve // 注意:如果您的Response是用于返回HTTP HEAD/304/204等请求的时候,waitClose则没有作用,因为这些请求默认不会发送body部分 event.waitUntil(uploadLog(response.body.waitClose())); return response; }
该函数用于在边缘接入层获取客户端信息。
addEventListener( 'fetch', (event) = > { event.respondWith(handle(event)); }); async function handle(event) { const info = event.info; console.log(info); // 边缘接入层获得关于请求的相关信息 return "done"; }
详细定义及用法参见MDN官方文档FormData