API

了解如何在服务器上调用 Better Auth API 端点,传递 body、headers 和 query 参数,获取响应 headers,以及处理错误。

当你创建一个新的 Better Auth 实例时,它会为你提供一个 api 对象。该对象暴露了 Better Auth 实例中的每一个端点。你可以使用它在服务器端与 Better Auth 进行交互。

无论是来自插件还是核心添加到 Better Auth 的任何端点,都可以通过 api 对象访问。

在服务器上调用 API 端点

要在服务器上调用 API 端点,导入你的 auth 实例并使用 api 对象调用端点。

server.ts
import { betterAuth } from "better-auth";
import { headers } from "next/headers";

export const auth = betterAuth({
    //...
})

// 在服务器上调用获取会话接口
await auth.api.getSession({
    headers: await headers() // 某些端点可能需要 headers
})

Body、Headers、Query

与客户端不同,服务器需要将值作为包含键的对象传递,body 对应请求体,headers 对应请求头,query 对应查询参数。

server.ts
import { auth } from "@/lib/auth"

await auth.api.getSession({
    headers: await headers() // 包含用户会话令牌的 headers
})

await auth.api.signInEmail({
    body: {
        email: "[email protected]",
        password: "password"
    },
    headers: await headers() // 可选,但有助于获取用户 IP、用户代理等信息
})

await auth.api.verifyEmail({
    query: {
        token: "my_token"
    }
})

Better Auth API 端点建立在 better-call 之上,这是一个小型 Web 框架,允许你像调用普通函数一样调用 REST API 端点,并使我们能够轻松地从服务器端推断客户端类型。

获取 headers 和 Response 对象

当你在服务器上调用 API 端点时,它会直接返回标准的 JavaScript 对象或数组,因为这只是一个普通函数调用。

但有时你可能想获取 headers 或 Response 对象,例如需要获取 cookies 或请求头时。

获取 headers

要获取 headers,你可以向端点传入 returnHeaders 选项。

server.ts
import { auth } from "@/lib/auth"

const { headers, response } = await auth.api.signUpEmail({
	returnHeaders: true,
	body: {
		email: "[email protected]",
		password: "password",
		name: "John Doe",
	},
});

headers 是一个 Headers 对象,你可以用它来获取 cookies 或请求头。

const cookies = headers.getSetCookie();
const customHeader = headers.get("x-custom-header");

获取 Response 对象

要获取 Response 对象,你可以向端点传入 asResponse 选项。

server.ts
import { auth } from "@/lib/auth"

const response = await auth.api.signInEmail({
    body: {
        email: "",
        password: ""
    },
    asResponse: true
})

错误处理

当你在服务器上调用 API 端点时,如果请求失败,它会抛出错误。你可以捕获该错误并按需处理。错误实例是 APIError 的一个实例。

server.ts
import { auth } from "@/lib/auth"
import { APIError, isAPIError } from "better-auth/api";

try {
    await auth.api.signInEmail({
        body: {
            email: "",
            password: ""
        }
    })
} catch (error) {
    if (isAPIError(error)) {
        console.log(error.message, error.status)
    }
}