Javascript serviceworker:处理并重新发送请求正文

Javascript serviceworker: Processing & resending body of request

我想使用 Javascript serviceworker 来记录传出请求。我目前的做法是:

self.addEventListener('fetch', function(event) {

    var req = new Request("https://example.com?url=" + encodeURI(event.request.url), {
        method: event.request.method,
        headers: event.request.headers,
        body: event.request.body
    });

    fetch(req);
});

这适用于 GET 请求,但不适用于 POST/PUT 请求中的 body。我尝试使用 body: event.request.body.blob(),但这也不起作用。

有没有一种简单的方法可以访问 serviceworkers 中获取的请求的主体并将其重新发送到其他地方?

您可以执行以下操作:

self.addEventListener("fetch", (event) => {
  const requestClone = event.request.clone();

  event.respondWith(
    (async function () {
      const params = await requestClone.json().catch((err) => err);

      if (params instanceof Error) {
        // this is a simple check, but handle errors appropriately
      }

      if (event.request.method === "POST") {
        console.log(`POST request with params: ${params}`);
        // do work here
      }
      return fetch(event.request);
    })()
  );
});

请注意,您必须为 event.request 创建一个克隆才能对其调用 text 方法,因为请求是一个流并且只能使用一次,所以您d 运行 如果您尝试获取请求的参数然后将其用于其他用途,则会出现问题。

此外,您可以使用以下任何方法从请求中检索正文,因此请使用任何合适的方法:

  • event.request.arrayBuffer()
  • event.request.blob()
  • event.request.json()
  • event.request.text()
  • event.request.formData()

假设上述代码片段包含在您的 ServiceWorker 文件中,以下示例将为您提供所需的内容:

fetch("https://jsonplaceholder.typicode.com/posts", {
  method: "POST",
  body: JSON.stringify({ title: "foo", body: "bar", userId: 1 }),
  headers: { "Content-Type": `application/json` },
})
  .then((response) => response.json())
  .then((json) => console.log(`fetch response`, json))
  .catch((error) => console.error(`fetch error`, error));

// console logs
//  >> POST request with {"title":"foo","body":"bar","userId":1} (worker.js)
//  >> fetch response {title: "foo", body: "bar", userId: 1, id: 101} (index.js)