Express 集成

本指南将向您展示如何将 Better Auth 与 express.js 集成。

在开始之前,请确保您已配置好 Better Auth 实例。如果您尚未完成此操作,请查看 安装

请注意,不支持 CommonJS (cjs)。通过在 package.json 中设置 "type": "module" 或将 tsconfig.json 配置为使用 ES 模块,来使用 ECMAScript Modules (ESM)。

挂载处理程序

要使 Better Auth 能够处理请求,我们需要将处理程序挂载到 API 路由上。创建一个捕获所有路由来管理所有针对 /api/auth/* 的请求(适用于 ExpressJS v4),或 /api/auth/*splat(适用于 ExpressJS v5)(或 Better Auth 选项中指定的任何其他路径)。

不要在 Better Auth 处理程序之前使用 express.json()。仅在其他路由中使用它,否则客户端 API 将卡在“pending”状态。

server.ts
import express from "express";
import { toNodeHandler } from "better-auth/node";
import { auth } from "./auth";

const app = express();
const port = 3005;

app.all("/api/auth/*", toNodeHandler(auth)); // For ExpressJS v4
// app.all("/api/auth/*splat", toNodeHandler(auth)); For ExpressJS v5 

// Mount express json middleware after Better Auth handler
// or only apply it to routes that don't interact with Better Auth
app.use(express.json());

app.listen(port, () => {
	console.log(`示例应用正在端口 ${port} 上监听`);
});

完成设置后,启动您的服务器。Better Auth 将准备好使用。您可以向 /ok 端点 (/api/auth/ok) 发送 GET 请求,以验证服务器是否正在运行。

CORS 配置

在将 Better Auth 与 Express 集成时,为了向 Express 服务器添加 CORS (跨源资源共享) 支持,您可以使用 cors 中间件。下面是一个更新的示例,展示如何为服务器配置 CORS:

import express from "express";
import cors from "cors"; // Import the CORS middleware
import { toNodeHandler, fromNodeHeaders } from "better-auth/node";
import { auth } from "./auth";

const app = express();
const port = 3005;

// Configure CORS middleware
app.use(
  cors({
    origin: "http://your-frontend-domain.com", // Replace with your frontend's origin
    methods: ["GET", "POST", "PUT", "DELETE"], // Specify allowed HTTP methods
    credentials: true, // Allow credentials (cookies, authorization headers, etc.)
  })
);

获取用户会话

要检索用户会话,您可以使用 auth 对象提供的 getSession 方法。此方法需要以特定格式传递请求头。为了简化此过程,Better Auth 提供了一个 fromNodeHeaders 辅助函数,它将 Node.js 请求头转换为 Better Auth 期望的格式(一个 Headers 对象)。

以下是 Express 路由中使用 getSession 的示例:

server.ts
import { fromNodeHeaders } from "better-auth/node";
import { auth } from "./auth"; // Your Better Auth instance

app.get("/api/me", async (req, res) => {
 	const session = await auth.api.getSession({
      headers: fromNodeHeaders(req.headers),
    });
	return res.json(session);
});

On this page