在 Next.js 的服务器组件(Server Components)里共享会话(session),可以借助第三方库(如 next-auth
或 express-session
结合自定义 API 路由)来实现,下面为你详细介绍这两种常见的实现方式。
使用 next-auth
next-auth
是 Next.js 官方推荐的身份验证解决方案,它内置了会话管理功能,能够方便地在服务器组件中共享会话。
1. 安装依赖
npm install next-auth
2. 配置 next-auth
在项目根目录下创建 [...nextauth].js
文件(通常位于 pages/api/auth
目录),示例如下:
// pages/api/auth/[...nextauth].js
import NextAuth from 'next-auth';
import Providers from 'next-auth/providers';
export default NextAuth({
providers: [
Providers.Google({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET
})
],
session: {
strategy: 'jwt'
}
});
3. 在服务器组件中使用会话
// pages/index.jsx
import { getServerSession } from 'next-auth/next';
import { authOptions } from '../pages/api/auth/[...nextauth]';
const HomePage = async () => {
const session = await getServerSession(authOptions);
if (session) {
return (
<div>
<p>欢迎,{session.user.name}</p>
</div>
);
}
return (
<div>
<p>请登录</p>
</div>
);
};
export default HomePage;
代码解释
- 配置
next-auth
:在[...nextauth].js
文件中配置身份验证提供者(如 Google)和会话策略(这里使用 JWT 策略)。 - 获取会话 :在服务器组件里使用
getServerSession
函数获取当前会话信息。如果会话存在,就显示用户信息;否则,提示用户登录。
使用 express-session
结合自定义 API 路由
如果你想使用传统的会话管理方式,可以结合 express-session
和自定义 API 路由来实现。
1. 安装依赖
npm install express-session
2. 创建自定义 API 路由
// pages/api/session.js
import express from 'express';
import session from 'express-session';
import { createRouter } from 'next-connect';
const app = express();
const router = createRouter();
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true,
cookie: { secure: false }
}));
router.get('/set', (req, res) => {
req.session.username = 'john_doe';
res.send('会话数据已设置');
});
router.get('/get', (req, res) => {
const username = req.session.username;
if (username) {
res.send(`用户名: ${username}`);
} else {
res.send('未找到会话数据');
}
});
export default router.handler({
onError: (err, req, res) => {
console.error(err);
res.status(500).end('服务器出错');
}
});
3. 在服务器组件中调用 API 路由
// pages/index.jsx
import { fetch } from 'next/dist/compiled/@edge-runtime/primitives/fetch';
const HomePage = async () => {
// 设置会话数据
const setResponse = await fetch('/api/session/set');
const setData = await setResponse.text();
// 获取会话数据
const getResponse = await fetch('/api/session/get');
const getData = await getResponse.text();
return (
<div>
<p>{setData}</p>
<p>{getData}</p>
</div>
);
};
export default HomePage;
- 配置会话中间件 :在自定义 API 路由里使用
express-session
配置会话中间件。 - 设置和获取会话数据 :通过自定义 API 路由的
/set
和/get
接口来设置和获取会话数据。 - 在服务器组件中调用 API :在服务器组件中使用
fetch
函数调用自定义 API 路由,从而实现会话数据的设置和获取。
总结
在 Next.js 的服务器组件中共享会话,可根据具体需求选择合适的方法。next-auth
适用于需要身份验证和会话管理的场景;而 express-session
结合自定义 API 路由则适用于传统的会话管理需求。