Skip to content

Commit 67c1efb

Browse files
R2-3381: add conditional/ranges to r2 workers example (#24323)
Co-authored-by: helloimalastair <[email protected]>
1 parent 85a3c72 commit 67c1efb

File tree

1 file changed

+102
-37
lines changed

1 file changed

+102
-37
lines changed

src/content/docs/r2/api/workers/workers-api-usage.mdx

Lines changed: 102 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -89,46 +89,111 @@ Use `wrangler dev --remote` if you want R2 operations made during development to
8989

9090
An R2 bucket is able to READ, LIST, WRITE, and DELETE objects. You can see an example of all operations below using the Module Worker syntax. Add the following snippet into your project's `index.js` file:
9191

92+
import { TabItem, Tabs } from "~/components";
93+
94+
<Tabs> <TabItem label="TypeScript" icon="seti:typescript">
95+
```ts
96+
import { WorkerEntrypoint } from "cloudflare:workers";
97+
98+
export default class extends WorkerEntrypoint<Env> {
99+
async fetch(request: Request) {
100+
const url = new URL(request.url);
101+
const key = url.pathname.slice(1);
102+
103+
switch (request.method) {
104+
case "PUT": {
105+
await this.env.R2.put(key, request.body, {
106+
onlyIf: request.headers,
107+
httpMetadata: request.headers,
108+
});
109+
return new Response(`Put ${key} successfully!`);
110+
}
111+
case "GET": {
112+
const object = await this.env.R2.get(key, {
113+
onlyIf: request.headers,
114+
range: request.headers,
115+
});
116+
117+
if (object === null) {
118+
return new Response("Object Not Found", { status: 404 });
119+
}
120+
121+
const headers = new Headers();
122+
object.writeHttpMetadata(headers);
123+
headers.set("etag", object.httpEtag);
124+
125+
// When no body is present, preconditions have failed
126+
return new Response("body" in object ? object.body : undefined, {
127+
status: "body" in object ? 200 : 412,
128+
headers,
129+
});
130+
}
131+
case "DELETE": {
132+
await this.env.R2.delete(key);
133+
return new Response("Deleted!");
134+
}
135+
default:
136+
return new Response("Method Not Allowed", {
137+
status: 405,
138+
headers: {
139+
Allow: "PUT, GET, DELETE",
140+
},
141+
});
142+
}
143+
}
144+
};
145+
```
146+
</TabItem> <TabItem label="JavaScript" icon="seti:javascript">
92147
```js
93148
export default {
94-
async fetch(request, env) {
95-
const url = new URL(request.url);
96-
const key = url.pathname.slice(1);
97-
98-
switch (request.method) {
99-
case "PUT":
100-
await env.MY_BUCKET.put(key, request.body);
101-
return new Response(`Put ${key} successfully!`);
102-
case "GET":
103-
const object = await env.MY_BUCKET.get(key);
104-
105-
if (object === null) {
106-
return new Response("Object Not Found", { status: 404 });
107-
}
108-
109-
const headers = new Headers();
110-
object.writeHttpMetadata(headers);
111-
headers.set("etag", object.httpEtag);
112-
113-
return new Response(object.body, {
114-
headers,
115-
});
116-
case "DELETE":
117-
await env.MY_BUCKET.delete(key);
118-
return new Response("Deleted!");
119-
120-
default:
121-
return new Response("Method Not Allowed", {
122-
status: 405,
123-
headers: {
124-
Allow: "PUT, GET, DELETE",
125-
},
126-
});
127-
}
128-
},
129-
};
149+
async fetch(request, env) {
150+
const url = new URL(request.url);
151+
const key = url.pathname.slice(1);
152+
153+
switch (request.method) {
154+
case "PUT": {
155+
await this.env.R2.put(key, request.body, {
156+
onlyIf: request.headers,
157+
httpMetadata: request.headers,
158+
});
159+
return new Response(`Put ${key} successfully!`);
160+
}
161+
case "GET": {
162+
const object = await this.env.R2.get(key, {
163+
onlyIf: request.headers,
164+
range: request.headers,
165+
});
166+
167+
if (object === null) {
168+
return new Response("Object Not Found", { status: 404 });
169+
}
170+
171+
const headers = new Headers();
172+
object.writeHttpMetadata(headers);
173+
headers.set("etag", object.httpEtag);
174+
175+
// When no body is present, preconditions have failed
176+
return new Response("body" in object ? object.body : undefined, {
177+
status: "body" in object ? 200 : 412,
178+
headers,
179+
});
180+
}
181+
case "DELETE": {
182+
await this.env.R2.delete(key);
183+
return new Response("Deleted!");
184+
}
185+
default:
186+
return new Response("Method Not Allowed", {
187+
status: 405,
188+
headers: {
189+
Allow: "PUT, GET, DELETE",
190+
},
191+
});
192+
}
193+
}
194+
}
130195
```
131-
196+
</TabItem> </Tabs>
132197
<Render file="request-dot-clone-warning" product="workers" />
133198

134199
## 5. Bucket access and privacy

0 commit comments

Comments
 (0)