绑定(env)· Cloudflare Workers 文档

内容

Bindings 允许您的 Worker 与 Cloudflare 开发者平台上的资源进行交互。

今天可用的绑定如下:

  • 人工智能: 在不管理服务器或基础设施的情况下,在GPU上运行生成性AI推理和机器学习模型。
  • 分析引擎: 从Workers直接以规模写入高基数数据和指标。
  • 浏览器渲染: 以编程方式控制和与无头浏览器实例交互。
  • D1: 在Cloudflare Workers中可用的API,用于与D1交互。D1是Cloudflare的原生无服务器数据库。
  • 调度器(平台的Workers): 让您的客户将自己的代码部署到您的平台,并动态地将请求从您的Worker调度到他们的Worker。
  • 持久对象: 一个全球分布的协调API,具有强一致性存储。
  • 环境变量: 向您的Worker添加字符串和JSON值。
  • 超驱动: 从Workers连接到您现有的数据库,将您现有的区域数据库转变为全球分布的数据库。
  • KV: 全球低延迟的键值数据存储。
  • mTLS: 配置您的Worker向强制执行mTLS连接的服务呈现客户端证书。
  • 队列: 发送和接收保证交付的消息。
  • R2: 在Cloudflare Workers中可用的API,用于从R2存储桶读取和写入。R2是与S3兼容的、零出口费用的全球分布对象存储。
  • 速率限制: 定义速率限制并直接从您的Cloudflare Worker与之交互。
  • 秘密: 向您的Worker添加加密的秘密。
  • 服务绑定: 促进Worker与Worker之间的通信。
  • 向量化: 在Cloudflare Workers中可用的API,用于与Vectorize交互。Vectorize是Cloudflare的全球分布向量数据库。
  • 版本元数据: 暴露Worker版本元数据(versionIDversionTag)。这些字段可以添加到从Worker发出的事件中,以发送到下游可观察性系统。

什么是绑定?

当您在 Worker 上声明绑定时,您授予它特定的功能,比如能够读取和写入文件到R2 存储桶。例如:

wrangler.toml { binding = "MY_BUCKET", bucket_name = "<MY_BUCKET_NAME>" }

index.js async fetch(request, env) { const key = url.pathname.slice(1); await env.MY_BUCKET.put(key, request.body); return new Response(`Put ${key} successfully!`);

您可以将绑定视为权限和 API 的结合体。使用绑定,您无需向 Worker 添加秘钥或令牌即可访问 Cloudflare 账户上的资源 — 权限已嵌入到 API 本身中。底层秘钥不会暴露给 Worker 的代码,因此不会意外泄露。

修改绑定

当您部署对 Worker 的更改时,仅更改其绑定(即不更改 Worker 的代码),Cloudflare 可能会重用已经运行您的 Worker 的现有隔离体。这会提高性能 — 您可以更改环境变量或其他绑定,而无需不必要地重新加载代码。

因此,在向全局范围添加绑定的衍生品时,您必须小心。您在那里创建的任何内容可能会继续存在,尽管对任何基础绑定进行更改。考虑一个使用从 env 访问的秘密 API 密钥的外部客户端实例:如果您将此客户端实例放在全局范围中,然后对秘密进行更改,则仍可能存在使用原始值的客户端实例。正确的方法是为每个请求创建一个新的客户端实例。

以下是一个很好的方法:

 let client = new Client(env.MY_SECRET); 

与这种可能具有令人惊讶和不希望的行为的替代方案相比:

 client ??= new Client(env.MY_SECRET); 

如果您有更高级的需求,请探索AsyncLocalStorage API,该API提供了一种向子执行处理程序公开值的机制。

总结
Cloudflare的Bindings允许Worker与Cloudflare开发平台上的资源进行交互。Bindings提供了多种功能,如AI、Analytics Engine、Durable Objects等。通过声明Bindings,Worker获得特定的能力,无需将密钥或令牌添加到Worker中即可访问资源。更改Bindings时,Cloudflare可能会重用已运行Worker的隔离环境,提高性能。需要注意避免在全局范围内创建与Bindings相关的派生物,应该为每个请求创建新的客户端实例。建议使用let client = new Client(env.MY_SECRET);而不是client ??= new Client(env.MY_SECRET);。对于更高级的需求,可以探索AsyncLocalStorage API。