2

我想记录通过 Cloudflare 向我的网站发出的请求。我想我可以使用 Cloudflare Workers 来做到这一点,但我不想通过向我的站点发出的每个请求都向它发出请求来拒绝我的日志服务。我可以让 Worker 将日志记录报告捆绑起来,并且每 10 或 100 次才向我发出请求吗?

4

1 回答 1

2

要回答我自己的问题,是的,您可以这样做!您必须使用event.waitUntil添加一个任务,该任务将在原始请求得到响应后运行。一个错误是如果 Worker 脚本从内存中被逐出,我们将丢失我们的batchedRequests,但这似乎并不经常发生。

addEventListener('fetch', event => {
  event.respondWith(fetchAndLog(event))
})

let batchedRequests = []

function sendRequests(){
  let promises = []
  for (var i=batchedRequests.length; i--;){
    promises.push(fetch(...batchedRequests[i]))
  }

  batchedRequests = []

  return Promise.all(promises)
}
/**
 * Fetch and log a given request object, uploading a logging request only when five are stored
 * @param {Request} request
 */
async function fetchAndLog(event) {
  batchedRequests.push(["https://hookb.in/Kb88Ybq8", {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      timestamp: +new Date
    })
  }])

  if (batchedRequests.length > 4){
    event.waitUntil(sendRequests())
  }

  return fetch(event.request)
}
于 2018-03-15T18:43:50.183 回答