标签: cloudflare-workers

如何使用Cloudflare Worker创建异步请求(非阻塞)

我正在编写一个Cloudflare Worker,需要在我的原始请求完成后ping一个分析服务.我不希望它阻止原始请求,因为我不希望延迟或分析系统的故障减慢或中断请求.如何创建在原始请求完成后开始和结束的请求?

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

async function handle(event) {
  const response = await fetch(event.request)

  // Send async analytics request.
  let promise = fetch("https://example.com")
      .then(response => {
    console.log("analytics sent!")
  })

  // If I uncomment this, only then do I see the
  // "analytics sent!" log message. But I don't
  // want to wait for it!
  //  await promise;

  return response
}
Run Code Online (Sandbox Code Playgroud)

javascript cloudflare-workers

5
推荐指数
1
解决办法
307
查看次数

使用 Cloudflare Workers 将图像发送到 Telegram

我尝试使用 Cloudflare Workers 将图像发送到 Telegram,但我的 Telegram 帐户中没有\xe2\x80\x99 收到该图像。另外,我的代码在 Chrome 开发者控制台中可以正常工作,因此 Cloudflare Workers 存在问题。你可以帮帮我吗?

\n\n
function b64toBlob(dataURI) {\n    var byteString = atob(dataURI.split(\',\')[1]);\n    var ab = new ArrayBuffer(byteString.length);\n    var ia = new Uint8Array(ab);\n\n    for (var i = 0; i < byteString.length; i++) {\n        ia[i] = byteString.charCodeAt(i);\n    }\n    return new Blob([ab], { type: \'image/jpeg\' });\n}\n\nconst telegram_token = "<my_bot_api_token>";\nconst telegram_url_img = "https://api.telegram.org/bot" + telegram_token + "/sendPhoto";\nconst base64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAAAhCAIAAAAeQ8GBAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGESURBVFhH7ZY90kUwFIZvaQm3tATLUCqVSqUdKC1BaQlKS7IEpe+dL+9kjJ84JOZi8lQ3nHOSJ8cNn/HteMPn4w2fjzd8Pt7wF3RdF4bhZw/E1HXNnG3uaPj9fikhAJ5N0zBzDVtDyX7vLmIKIpkmJggCJq9hayjcb/MiFMvN4o01hmHIsoxxxkhbQ86wR57nTNhmtlmSFIZeZyh5orDZjN5m1r00TSVZgAluDWG1+8fTSPoApt2DHq8KYI5DQ5zOLLlAKLMKSxzpnoJpDg0N3WPEKVjieBGmOTQsyxLlkiTRO60mAGp4Dpa4gyHo+56//uEMbzKcgRedmqOqKl46jqoAOBbDtEsNi6JQc0je6VuoCoBjMXp/OV7D1hB/SD0NziHJp/ASlQ44FoMHB1nmY9zWEOg2KnAa8YYYZh43lOCgKNo4/UScgq7Cf3Y4LWH0bQ0V8IzjmCs9C2s5xWVRQzOFsJBTLimqads2iiIufw+b7z4D1xreAW/4fLzh83m74Tj+AcvdXhfpeUapAAAAAElFTkSuQmCC"\n\nconst blob = b64toBlob(base64);\nvar fd = new FormData();\nfd.append(\'photo\', blob)\nfd.append(\'chat_id\', <my_chat_id>)\nconst telegram_init = {\n      method: …
Run Code Online (Sandbox Code Playgroud)

javascript cloudflare telegram cloudflare-workers

5
推荐指数
1
解决办法
1001
查看次数

CloudFlare Workers-检查Cookie,添加标题,设置Cookie

我想仅通过首次访问者通过CloudFlare工作者动态添加http-header 。例如,这些标头:

Link: </path/to/file.css>; rel=preload; as=style; nopush
Link: </path/to/script.js>; rel=preload; as=script; nopush
Run Code Online (Sandbox Code Playgroud)

因此,我需要通过CloudFlare Workers中的JavaScript进行以下操作:

  1. 检查客户端是否存在特定的cookie。
  2. 如果该cookie不存在,请添加http-headers,然后设置该特定cookie。
  3. 如果cookie存在,则不执行任何操作。

您可以在此处使用代码。

这是CF博客中的一个一般示例(涉及cookie和标头):

// A Service Worker which skips cache if the request contains
// a cookie.
addEventListener('fetch', event => {
  let request = event.request
  if (request.headers.has('Cookie')) {
    // Cookie present. Add Cache-Control: no-cache.
    let newHeaders = new Headers(request.headers)
    newHeaders.set('Cache-Control', 'no-cache')
    event.respondWith(fetch(request, {headers: newHeaders}))
  }

  // Use default behavior.
  return
})
Run Code Online (Sandbox Code Playgroud)

javascript cookies http-headers cloudflare cloudflare-workers

4
推荐指数
1
解决办法
4127
查看次数

什么是 cloudflare KV preview_ids 以及如何获取?

我有一个追随者wrangler.toml。当我想使用devor preview(例如npx wrangler devor npx wrangler preview) wrangler 要求将 a 添加preview_id到 KV 命名空间时。这是现有 KV 命名空间的标识符吗?

我在https://github.com/cloudflare/wrangler/issues/1458 上看到Cloudflare Workers GH 中有一张票,它告诉我们应该澄清这一点,但该票已通过添加错误消息关闭

为了预览具有 KV 命名空间的 worker,您必须在配置文件中为要预览的每个 KV 命名空间指定一个 preview_id。”

这就是我在这里的原因。:)

至于更大的上下文,如果有人能澄清一下,我会很高兴:我看到如果我给出现有命名空间的值,我可以预览并看到__some-worker-dev-1234-workers_sites_assets_previewCloudflare 中生成了一个 KV 命名空间类型。这与 中使用的标识符所指向的 KV 命名空间具有不同的标识符,preview_id并且我所使用的标识符所指向的 KV 命名空间preview_id为空。为什么给出现有 KV 命名空间的标识符会删除错误消息、部署资产并允许预览,但实际的 KV 命名空间为空并创建了一个新的命名空间?

kv-asset-handler如何知道查看这个生成的命名空间以检索资产?

我目前正在使用默认生成的 Cloudare Worker 对我的站点进行测试,我想知道我是否误解了某些内容,或者是否有一些机制在预览/发布站点命名空间到 scipt 期间捆绑在一起。

如果有一些带有自动映射的随机机制,那么这是否可以让每个开发人员都可以拥有自己的私有预览 KV 命名空间?

type = "javascript"
name = "some-worker-dev-1234"
account_id = "<id>"
workers_dev …
Run Code Online (Sandbox Code Playgroud)

cloudflare cloudflare-workers

4
推荐指数
2
解决办法
1456
查看次数

访问 Cloudflare Workers 站点的压缩数据

我的 cloudflare 工作人员站点包含 React 应用程序获取的二进制数据。该二进制数据以 gzip 压缩形式存储,因为它压缩得非常好(我们谈论的是 20-25 倍的压缩,未压缩时它太大,无法满足 10MB KV 限制)。我遇到的问题是工作人员返回的数据没有适当的标头:

Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)

或者如果我让工作人员添加标头,cloudflare 将双重压缩响应。那么,如何在 cloudflare KV 中存储 gzip 压缩数据,以便我可以使用正确的内容编码返回它,而无需 cloudflare 双重压缩响应?

参考

为了最小化复制:这是我正在使用的两个工作脚本。

Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)

上面的工作脚本返回没有内容编码标头的二进制数据,因此浏览器不会自动膨胀响应。

所以然后我尝试通过手动添加标题

import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'

addEventListener('fetch', event => {
  try {
    event.respondWith(handleEvent(event))
  } catch (e) {
    event.respondWith(new Response('Internal Error', { status: 500 }))
  }
})

async function handleEvent(event) {
  const cacheControl = { browserTTL: 60 * 60 * 6 };
  return await getAssetFromKV(event, { mapRequestToAsset, cacheControl });
}
Run Code Online (Sandbox Code Playgroud)

响应具有正确的内容编码,但 …

cloudflare cloudflare-workers

4
推荐指数
1
解决办法
995
查看次数

如何让 Cloudflare 工作器覆盖响应状态代码但保留响应的其余部分?

具体来说,我有兴趣将代码 403 的所有响应更改为代码 404,并将代码 301 的所有响应更改为 302。我不希望响应的任何其他部分发生变化,除了状态文本(我想为空) . 以下是我自己的尝试:

addEventListener("fetch", event => {
  event.respondWith(fetchAndModify(event.request));
});

async function fetchAndModify(request) {
  // Send the request on to the origin server.
  const response = await fetch(request);

  const body = await response.body
  newStatus = response.status
  if (response.status == 403) {
    newStatus = 404
  } else if (response.status == 301) {
    newStatus = 302
  }

  // Return modified response.
  return new Response(body, {
    status: newStatus,
    statusText: "",
    headers: response.headers
  });
}
Run Code Online (Sandbox Code Playgroud)

我已确认此代码有效。我想知道这是否有可能覆盖除状态代码或文本以外的部分响应,如果是这样,我该如何避免?如果这违反 Cloudflare 工作人员或 javascript …

javascript cloudflare cloudflare-workers

3
推荐指数
1
解决办法
1212
查看次数

在开发过程中,如何在本地运行我的 cloudflare worker 无服务器功能?

我设法根据https://serverless.com/framework/docs/providers/cloudflare/guide/使用无服务器框架部署了我的第一个 cloudflare 工作器, 并且当我到达云端时它正在工作。

在开发过程中,希望能够在http://localhost:8080/ *上进行测试

使用 serverless.yml 中指定的函数启动本地 http 服务器并处理我的请求的最简单方法是什么?

我查看了https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint 但没有“开始”脚本。

https://github.com/serverless/上似乎没有关于 cloudflare 的例子

cloudflare serverless-framework serverless serverless-plugins cloudflare-workers

3
推荐指数
1
解决办法
1683
查看次数

Cloudflare Worker TypeError:一次性使用的主体

我正在尝试使用Cloudflare Worker将 POST 请求代理到另一台服务器。

它抛出了一个 JS 异常——通过包含在一个 try/catch 博客中,我已经确定错误是:

TypeError: A request with a one-time-use body (it was initialized from a stream, not a buffer) encountered a redirect requiring the body to be retransmitted. To avoid this error in the future, construct this request from a buffer-like body initializer.

我原以为这可以通过简单地复制 Response 来解决,以便它不被使用,如下所示:

return new Response(response.body, { headers: response.headers })

这是行不通的。我在这里缺少流式传输与缓冲的什么?

addEventListener('fetch', event => {

  var url = new URL(event.request.url);

  if (url.pathname.startsWith('/blog') || url.pathname === '/blog') {
    if (reqType …
Run Code Online (Sandbox Code Playgroud)

javascript fetch-api cloudflare-workers

3
推荐指数
1
解决办法
1010
查看次数

在 Typescript 中使用环境变量

有没有正确的方法将环境变量包含在.ts文件中?它们是在 CLI 中wrangler.toml或通过 CLI 声明的,但 Typescript 不会知道它们的存在。

目前我要么使用 .js 文件来声明这些变量,然后导入到.ts

//env.js
const SOMEVAR = SOMEVAR
Run Code Online (Sandbox Code Playgroud)

或者我需要使用@ts-ignore评论。

我已经尝试过process.env,但正如预期的那样,由于脚本未在 Node 中运行,因此失败了。

cloudflare-workers

3
推荐指数
1
解决办法
2964
查看次数

使用工人 KV 进行 Sveltekit 开发——热重载

开发 Svelte/kit 应用程序时是否可以使用 CloudFlare 的 Workers KV?

wrangler dev使用 CloudFlare Workers 适配器时可以构建应用程序然后运行:

npm build
wrangler dev
Run Code Online (Sandbox Code Playgroud)

但是,我还没有进行热模块重新加载工作:

npm dev & wrangler dev
Run Code Online (Sandbox Code Playgroud)

cloudflare svelte cloudflare-workers sveltekit

3
推荐指数
1
解决办法
1328
查看次数