Better Auth 集成

性能与组合

监控会话解析时间,启用会话缓存,连接独立的 Nitro 钩子,并与 AI SDK 集成结合使用。

getSession() 每次请求都会产生一次数据库查询。该集成会为你测量这一过程,并将耗时暴露为 auth.resolvedIn,这样你就能在用户察觉之前发现性能回归。

监控会话解析时间

宽事件 — 会话解析缓慢
{
  "auth": { "resolvedIn": 245, "identified": true },
  "duration": "312ms"
}

auth.resolvedIn 相对于 duration 较高时,说明你的认证后端是性能瓶颈。

针对高流量进行调优

  1. 在 Better Auth 中启用 cookie 缓存,这样会话查找就不会每次都访问数据库。
  2. createAuthMiddleware 上使用 exclude,跳过不需要用户上下文的公开路由。
  3. 使用 include 将解析范围限制到特定的路由模式,而不是整个应用。

缓存后的常见 P95 目标:auth.resolvedIn < 5ms

独立 Nitro

createAuthIdentifier 是一个工厂函数,用于创建 Nitro 的 request 钩子。它专为 独立 Nitro 应用设计,其中 evlog Nitro 模块负责处理钩子顺序。

对于 Nuxt,请改为在 server middleware 中使用 createAuthMiddleware —— Nitro 插件的钩子顺序可能会导致在 request 钩子中日志器尚未可用。
server/plugins/evlog-auth.ts
import { createAuthIdentifier } from 'evlog/better-auth'
import { auth } from './lib/auth'

export default defineNitroPlugin((nitroApp) => {
  nitroApp.hooks.hook('request', createAuthIdentifier(auth, {
    exclude: ['/api/auth/**', '/api/public/**'],
  }))
})

它接受与 createAuthMiddleware 相同的选项。

与 AI SDK 结合使用

当你也使用 evlog/ai 时,你的宽事件会将用户身份 AI 指标合并到同一个事件中:

宽事件 — AI + 用户
{
  "method": "POST",
  "path": "/api/chat",
  "status": 200,
  "duration": "4.5s",
  "userId": "QBX9tPjJQExWawAbNll75",
  "user": {
    "id": "QBX9tPjJQExWawAbNll75",
    "name": "Hugo Richard",
    "email": "hugo@example.com"
  },
  "auth": { "resolvedIn": 8, "identified": true },
  "ai": {
    "calls": 1,
    "model": "claude-sonnet-4.6",
    "provider": "anthropic",
    "inputTokens": 3312,
    "outputTokens": 814,
    "totalTokens": 4126,
    "msToFirstChunk": 234,
    "msToFinish": 4500,
    "tokensPerSecond": 180
  }
}

这就是宽事件的强大之处——每个请求一个事件,所有上下文都集中在一处:谁发起了请求、他们做了什么、AI 如何响应,以及它的表现如何。