Use Queues to store data in R2
Last reviewed: over 3 years ago
Example of how to use Queues to batch data and store it in an R2 bucket.
The following Worker will catch JavaScript errors and send them to a queue. The same Worker will receive those errors in batches and store them to a log file in an R2 bucket.
{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "my-worker", "queues": { "producers": [ { "queue": "my-queue", "binding": "ERROR_QUEUE" } ], "consumers": [ { "queue": "my-queue", "max_batch_size": 100, "max_batch_timeout": 30 } ] }, "r2_buckets": [ { "bucket_name": "my-bucket", "binding": "ERROR_BUCKET" } ]}"$schema" = "./node_modules/wrangler/config-schema.json"name = "my-worker"
[[queues.producers]]queue = "my-queue"binding = "ERROR_QUEUE"
[[queues.consumers]]queue = "my-queue"max_batch_size = 100max_batch_timeout = 30
[[r2_buckets]]bucket_name = "my-bucket"binding = "ERROR_BUCKET"interface ErrorMessage { message: string; stack?: string;}
interface Env { readonly ERROR_QUEUE: Queue<ErrorMessage>; readonly ERROR_BUCKET: R2Bucket;}
export default { async fetch(req, env, ctx): Promise<Response> { try { return doRequest(req); } catch (e) { const error: ErrorMessage = { message: e instanceof Error ? e.message : String(e), stack: e instanceof Error ? e.stack : undefined, }; await env.ERROR_QUEUE.send(error); return new Response(error.message, { status: 500 }); } }, async queue(batch, env, ctx): Promise<void> { let file = ""; for (const message of batch.messages) { const error = message.body; file += error.stack ?? error.message; file += "\r\n"; } await env.ERROR_BUCKET.put(`errors/${Date.now()}.log`, file); },} satisfies ExportedHandler<Env, ErrorMessage>;
function doRequest(request: Request): Response { if (Math.random() > 0.5) { return new Response("Success!"); } throw new Error("Failed!");}