调用函数
如何使用 JavaScript SDK 或通过 HTTP 调用已部署的函数,以及您的函数如何知道谁在调用。
1. SDK调用
invoke 是公钥可以进行的唯一调用。它在浏览器和服务器上的工作方式相同。
通用 invoke<T> 仅键入响应。编译时不会检查名称和主体。
list、 get、 listJobs、 enqueueJob 和其他管理方法需要 service_role 密钥并且属于您的服务器。公钥接收 403。请参阅 谁可以调用。
2. 描述请求
您的函数接收 与您描述的请求完全相同 ,而不是它的包装器。
| 选项 | 默认 | 该函数看到什么 |
|---|---|---|
method | POST | req.method |
path | / | new URL(req.url).pathname |
headers | 无 | req.headers,下面列出的平台标头除外 |
body | 无 | await req.json() (或 req.text() 对于字符串) |
timeout | 客户端默认(30 秒) | 不可见:取消您的呼叫 |
signal | 无 | 不可见:取消您的呼叫 |
responseType | 'json' | 不可见:SDK 如何解码响应,请参阅 非 JSON 响应 |
值得了解的规则:
GET和HEAD不带正文发送。- 非字符串的正文将作为 JSON 发送,并带有
content-type: application/json,除非您设置了该值。 字符串 正文按原样发送,并且还会获取content-type: application/json,因此请使用req.text()读取它。 - 如果没有
body,该函数会收到没有正文的请求。裸露的await req.json()会抛出异常,因此当可以在没有有效负载的情况下进行调用时,请编写await req.json().catch(() => ({}))。 - 主体必须是 JSON:对象、数组、字符串、数字或布尔值。在发送任何请求之前,会拒绝
Blob、ArrayBuffer、类型化数组、FormData、URLSearchParams或ReadableStream,并显示错误代码invalid_body。 - 帧标头(
content-length、transfer-encoding、connection、host等)将被忽略。
3.读取来电者身份
平台会在函数运行之前验证密钥和用户的令牌,然后添加以下标头:
| 标头 | 价值 |
|---|---|
x-aura-role | anon、 authenticated 或 service_role |
x-aura-user-id | 当 x-aura-role 为 authenticated时用户的 id,否则不存在 |
x-aura-project-id | 项目编号 |
authorization | 用户的 JWT,仅适用于登录用户 |
apikey | 通话时使用的密钥 |
使用三个不同的键进行此调用的实际结果:
平台会丢弃 authorization、 apikey、 x-request-id 以及调用者放入 headers中的每个 x-aura-* 标头,无论其情况如何。只有它本身验证的值才能达到您的功能。其他自定义标头不变地通过。
调用的 x-request-id 不会转发到您的函数。要将调用与日志行关联起来,请生成您自己的 ID,将其发送到 headers 并将其记录到函数中。
4.通过HTTP调用
如果没有 SDK,请发送描述请求的 JSON 对象。 body 字段是您的函数接收的内容。
apikey 和 Content-Type: application/json 都是必需的。添加 Authorization: Bearer <user JWT> 以作为登录用户进行调用。默认响应是一个信封; X-Aurabase-Invoke-Mode: raw 标头返回函数自己的响应,请参阅 非 JSON 响应。
5. 读取结果
invoke 永远不会抛出异常。它返回 { data, error }:
当您需要值时测试 data 而不是 error : TypeScript 然后知道它不是 null。要精确处理故障,请阅读 错误、超时和重试。