Next.js搭配Koa服务端时如何实现session,koa-session和next-auth该如何选择
如何将koa-session传递给Next.js
Node 原生的请求对象(ctx.req)支持挂载自定义属性,不需要修改handle方法的传参结构,直接挂载后Next.js侧即可读取:
Koa侧修改代码
router.get("(.*)", async (ctx) => { console.log("server.js session: ", ctx.session); // 初始化+更新session逻辑 ctx.session.custom_data = (ctx.session.custom_data || 0) + 123; // 将会话挂载到原生req对象上 ctx.req.koaSession = ctx.session; // 交给Next.js处理请求 await handle(ctx.req, ctx.res); // 告知koa不要覆写Next.js已经返回的响应 ctx.respond = false; });
Next.js侧读取session
Pages 路由
在页面的getServerSideProps中直接读取挂载的属性,再传给页面组件:
export async function getServerSideProps(context) { const session = context.req.koaSession; return { props: { session } }; } // 页面组件直接用props.session即可 export default function Page({ session }) { return <div>自定义字段:{session?.custom_data}</div> }
App 路由
在服务端组件中可以直接读取koa-session设置的Cookie,自行解析或者通过Next.js中间件统一挂载到请求上下文即可。
koa-session 与 next-auth 选型建议
优先选koa-session的场景
- 项目已有大量基于Koa实现的业务逻辑、用户体系、权限校验规则,迁移成本高
- Session需要同时供给Koa上的其他接口、非Next.js业务模块使用,要求会话逻辑在服务侧统一收口
- 会话规则高度定制化,比如需要对接自研身份系统、特殊的过期规则、多端会话同步等逻辑
优先选next-auth的场景
- 项目核心逻辑都在Next.js侧,没有Koa侧的遗留业务负担,next-auth开箱支持OAuth、邮箱登录、JWT/数据库存储等常用能力,不需要自己实现会话的安全校验、过期、刷新逻辑
- 需要客户端侧直接读取会话状态,next-auth提供了
useSession等封装好的客户端Hook,无需自行封装接口拉取会话 - 后续计划去掉Koa自定义服务器,直接用Next.js标准部署方案,减少架构复杂度
内容的提问来源于stack exchange,提问作者avocado
相关产品推荐
相关产品推荐

