export default {
async fetch(request, env) {
const url = new URL(request.url);
const key = url.pathname.slice(1);
switch (request.method) {
case "PUT":
await env.MY_BUCKET.put(key, request.body);
return new Response(`Put ${key} successfully!`);
case "GET":
const object = await env.MY_BUCKET.get(key);
if (object === null) {
return new Response("Object Not Found", { status: 404 });
}
const headers = new Headers();
object.writeHttpMetadata(headers);
headers.set("etag", object.httpEtag);
return new Response(object.body, {
headers,
});
case "DELETE":
await env.MY_BUCKET.delete(key);
return new Response("Deleted!");
default:
return new Response("Method Not Allowed", {
status: 405,
headers: {
Allow: "PUT, GET, DELETE",
},
});
}
},
};
这段代码是一个用于 [Cloudflare Workers](
https://developers.cloudflare.com/workers/) 的服务端脚本,**实现了一个简单的对象存储 HTTP API**。它允许用户通过 HTTP 请求(PUT、GET、DELETE 方法)对 Cloudflare R2 存储桶(MY_BUCKET)中的对象进行增删查操作。
下面是详细原理解释:
---
## 1. **整体结构**
```js
export default {
async fetch(request, env) { ... }
}
```
- 这是一个 Workers 的模块化写法,`fetch` 方法会在每个 HTTP 请求到来时被自动调用。
- `request` 是 HTTP 请求对象,`env` 是注入的环境变量(包括 R2 存储桶 MY_BUCKET)。
---
## 2. **路径和 key 的提取**
```js
const url = new URL(request.url);
const key = url.pathname.slice(1);
```
- 解析请求的 URL,获取 path 部分(比如 `/myfile.txt`)。
- 去掉前导 `/`,得到 key(如 `myfile.txt`),用作 R2 存储桶的对象名。
---
## 3. **根据 HTTP 方法分流操作**
### **PUT 方法:上传对象**
```js
await env.MY_BUCKET.put(key, request.body);
return new Response(`Put ${key} successfully!`);
```
- 把请求体(request.body,通常是文件或数据)存入 MY_BUCKET,key 为路径名。
- 返回成功响应。
---
### **GET 方法:下载对象**
```js
const object = await env.MY_BUCKET.get(key);
if (object === null) {
return new Response("Object Not Found", { status: 404 });
}
const headers = new Headers();
object.writeHttpMetadata(headers);
headers.set("etag", object.httpEtag);
return new Response(object.body, { headers });
```
- 尝试从 MY_BUCKET 读取 key 对应的对象。
- 如果对象不存在,返回 404。
- 如果存在:
- 创建响应头(包括对象的元信息和 etag)。
- 返回对象内容(object.body)和这些头部。
---
### **DELETE 方法:删除对象**
```js
await env.MY_BUCKET.delete(key);
return new Response("Deleted!");
```
- 删除 key 对应的存储对象。
- 返回成功响应。
---
### **其他方法:返回 405**
```js
return new Response("Method Not Allowed", {
status: 405,
headers: { Allow: "PUT, GET, DELETE" },
});
```
- 限定只允许 PUT、GET、DELETE,其他方法(如 POST、PATCH 等)返回 405 错误。
---
## 4. **用途场景举例**
- 可以作为一个简单的**对象存储网关**,让你的前端、移动端应用通过 HTTP API 存储和读取文件。
- 支持 RESTful 风格的操作:上传(PUT)、下载(GET)、删除(DELETE)。
---
## 5. **流程图(文字版,便于理解)**
```
收到 HTTP 请求
│
├─> 解析 URL 得到 key
│
├─> 判断 HTTP 方法
│ ├─ PUT → 存储对象到 MY_BUCKET
│ ├─ GET → 读取对象,返回内容或 404
│ ├─ DELETE → 删除对象
│ └─ 其他 → 返回 405
```
---
## 6. **相关背景知识**
- **Cloudflare R2** 是 Cloudflare 推出的 S3 兼容对象存储服务。
- 通过 `env.MY_BUCKET` 访问 Cloudflare Workers 绑定的 R2 存储桶,实现对象的存储和管理。
---
如果你想要了解如何部署、绑定 R2,或者对代码的某一部分有疑问,欢迎继续提问!