我正在编写一个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) 我尝试使用 Cloudflare Workers 将图像发送到 Telegram,但我的 Telegram 帐户中没有\xe2\x80\x99 收到该图像。另外,我的代码在 Chrome 开发者控制台中可以正常工作,因此 Cloudflare Workers 存在问题。你可以帮帮我吗?
\n\nfunction 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) 我想仅通过首次访问者通过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进行以下操作:
您可以在此处使用代码。
这是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
我有一个追随者wrangler.toml
。当我想使用dev
or preview
(例如npx wrangler dev
or 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_preview
Cloudflare 中生成了一个 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 工作人员站点包含 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)
响应具有正确的内容编码,但 …
具体来说,我有兴趣将代码 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 …
我设法根据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
我正在尝试使用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) 有没有正确的方法将环境变量包含在.ts
文件中?它们是在 CLI 中wrangler.toml
或通过 CLI 声明的,但 Typescript 不会知道它们的存在。
目前我要么使用 .js 文件来声明这些变量,然后导入到.ts
//env.js
const SOMEVAR = SOMEVAR
Run Code Online (Sandbox Code Playgroud)
或者我需要使用@ts-ignore
评论。
我已经尝试过process.env
,但正如预期的那样,由于脚本未在 Node 中运行,因此失败了。
开发 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 ×7
javascript ×5
cookies ×1
fetch-api ×1
http-headers ×1
serverless ×1
svelte ×1
sveltekit ×1
telegram ×1