Utils

请求

访问传入请求的工具

assertMethod(event, expected, allowHead?)

断言传入请求的方法是预期类型,使用 isMethod 进行验证。

如果该方法不被允许,则将抛出 405 错误,消息为 "HTTP 方法不被允许"。

如果 allowHeadtrue,则如果预期方法为 GET,则将允许 HEAD 请求通过。

示例:

getQuery(event)

从请求 URL 中获取解析后的查询字符串对象。

示例:

getRequestHost(event, opts: { xForwardedHost? })

获取请求主机名。

如果 xForwardedHosttrue,则会使用 x-forwarded-host 请求头(如果存在)。

如果未找到主机头,将默认为 "localhost"。

示例:

getRequestIP(event)

尝试从传入请求中获取客户端 IP 地址。

如果 xForwardedFortrue,则会使用 x-forwarded-for 请求头(如果存在)。

如果无法确定 IP,将默认为 undefined

示例:

getRequestProtocol(event, opts: { xForwardedProto? })

获取请求协议。

如果 x-forwarded-proto 头被设置为 "https",则将返回 "https"。您可以通过将 xForwardedProto 设置为 false 来禁用此行为。

如果无法确定协议,将默认为 "http"。

示例:

getRequestURL(event, opts: { xForwardedHost?, xForwardedProto? })

使用 getRequestProtocolgetRequestHostevent.path 生成完整的传入请求 URL。

如果 xForwardedHosttrue,则会使用 x-forwarded-host 请求头(如果存在)。

如果 xForwardedProtofalse,则不会使用 x-forwarded-proto 请求头。

示例:

getRouterParam(event, name, opts: { decode? })

通过名称获取匹配的路由参数。

如果 decode 选项为 true,将使用 decodeURI 解码匹配的路由参数。

示例:

getRouterParams(event, opts: { decode? })

获取匹配的路由参数。

如果 decode 选项为 true,将使用 decodeURIComponent 解码匹配的路由参数。

示例:

getValidatedQuery(event, validate)

从请求 URL 获取查询参数,并通过验证函数进行验证。

您可以使用简单的函数来验证查询对象,或者使用像 zod 这样的库来定义一个 schema。

示例:

getValidatedRouterParams(event, validate, opts: { decode? })

获取匹配的路由参数,并通过验证函数进行验证。

如果 decode 选项为 true,将使用 decodeURI 解码匹配的路由参数。

您可以使用简单的函数来验证参数对象,或者使用像 zod 这样的库来定义一个 schema。

示例:

isMethod(event, expected, allowHead?)

检查传入请求的方法是否为预期类型。

如果 allowHeadtrue,则允许 HEAD 请求通过(若预期方法为 GET)。

示例:

getRequestFingerprint(event, opts)

获取传入请求的唯一指纹。

readBody(event)

读取请求体并尝试使用 JSON.parse 或 URLSearchParams 进行解析。

示例:

readValidatedBody(event, validate)

尝试通过 readBody 读取请求体,然后使用提供的验证函数,如果验证失败则抛出验证错误,或返回结果。

您可以使用简单的函数来验证请求体,或使用像 zod 这样的库来定义一个 schema。

示例:

app.use("/", (event) => {
  assertMethod(event, "GET");
  // 处理 GET 请求,否则抛出 405 错误
});
app.use("/", (event) => {
  const query = getQuery(event); // { key: "value", key2: ["value1", "value2"] }
});
app.use("/", (event) => {
  const host = getRequestHost(event); // "example.com"
});
app.use("/", (event) => {
  const ip = getRequestIP(event); // "192.0.2.0"
});
app.use("/", (event) => {
  const protocol = getRequestProtocol(event); // "https"
});
app.use("/", (event) => {
  const url = getRequestURL(event); // "https://example.com/path"
});
app.use("/", (event) => {
  const param = getRouterParam(event, "key");
});
app.use("/", (event) => {
  const params = getRouterParams(event); // { key: "value" }
});
app.use("/", (event) => {
  const query = getValidatedQuery(event, (data) => {
    return "key" in data && typeof data.key === "string";
  });
});

示例:

import { z } from "zod";
app.use("/", (event) => {
  const query = getValidatedQuery(
    event,
    z.object({
      key: z.string(),
    }).parse,
  );
});
app.use("/", (event) => {
  const params = getValidatedRouterParams(event, (data) => {
    return "key" in data && typeof data.key === "string";
  });
});

示例:

import { z } from "zod";
app.use("/", (event) => {
  const params = getValidatedRouterParams(
    event,
    z.object({
      key: z.string(),
    }).parse,
  );
});
app.use("/", (event) => {
  if (isMethod(event, "GET")) {
    // 处理 GET 请求
  } else if (isMethod(event, ["POST", "PUT"])) {
    // 处理 POST 或 PUT 请求
  }
});

Body 工具

app.use("/", async (event) => {
  const body = await readBody(event);
});
app.use("/", async (event) => {
  const body = await readValidatedBody(event, (body) => {
    return typeof body === "object" && body !== null;
  });
});

示例:

import { z } from "zod";
app.use("/", async (event) => {
  const objectSchema = z.object();
  const body = await readValidatedBody(event, objectSchema.safeParse);
});