NextJS 13.4 App Router API路由无法使用aws-amplify求助
问题分析与解决思路
核心原因是Next.js App Router的API路由使用Web标准Request对象,而旧版Page Router用的是Node.js的http.IncomingMessage,Amplify的withSSRContext目前对App Router的Request对象兼容性不佳,无法自动解析Cookie中的用户会话。
以下是具体解决步骤:
1. 手动解析Cookie并初始化Auth
跳过withSSRContext,直接从Request头中提取Cookie,手动配置Amplify Auth的存储来读取会话:
import { Auth } from 'aws-amplify'; export async function GET(request) { // 提取Cookie头 const cookieHeader = request.headers.get('cookie'); if (!cookieHeader) { return new Response('Unauthorized', { status: 401 }); } // 解析Cookie键值对 const cookies = cookieHeader.split(';').reduce((acc, cookie) => { const [key, value] = cookie.trim().split('='); acc[key] = decodeURIComponent(value); return acc; }, {}); // 替换成你的Amplify Auth Cookie名称(通常是amplify-auth,可在浏览器DevTools中确认) const authSessionCookie = cookies['amplify-auth']; if (!authSessionCookie) { return new Response('Unauthorized', { status: 401 }); } try { // 手动配置Auth存储,让它读取我们提取的会话Cookie Auth.configure({ storage: { getItem: () => authSessionCookie, setItem: () => {}, // 不需要写入,只读即可 removeItem: () => {} } }); const user = await Auth.currentAuthenticatedUser(); // 这里可以获取user的令牌,附加到API Gateway请求中 return new Response(JSON.stringify({ userId: user.username, token: user.signInUserSession.idToken.jwtToken }), { status: 200, headers: { 'Content-Type': 'application/json' } }); } catch (err) { console.error('获取用户失败:', err); return new Response('Failed to authenticate user', { status: 500 }); } }
2. 切换到Node.js Runtime(可选)
App Router的API路由默认使用Edge Runtime,某些Amplify的SSR方法可能依赖Node.js API。在路由文件顶部添加以下代码强制使用Node.js Runtime:
export const runtime = 'nodejs';
3. 更新Amplify到最新版本
旧版aws-amplify可能未适配Next.js App Router,执行更新命令:
npm update aws-amplify # 或 yarn upgrade aws-amplify
内容的提问来源于stack exchange,提问作者lentyai
相关产品推荐
相关产品推荐

