next.js API文件夹内的Clerk getAuth()帮助程序返回:{ userId:null }

wribegjk  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

在这里完全被难倒了。
使用clerk,我想使用getAuth()帮助程序访问当前用户的userId。
标签:https://clerk.com/docs/references/nextjs/get-auth

pages/api/example.ts

import { getAuth } from "@clerk/nextjs/server";
import type { NextApiRequest, NextApiResponse } from "next";
 
export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const { userId } = getAuth(req);
  // Load any data your application needs for the API route
  return res.status(200).json({ userId: userId });

字符串
现在,当我在浏览器中访问此端点时:

http://localhost:3000/api/example


它似乎工作,因为我看到我的浏览器中打印的userId:

{"userId":"user_2Ze2xqQyKbZbsXaZi7cv1sXLf2S"}


但是,当我尝试在getServerSideProps函数中调用此API端点时,我收到:{ userId: null }

pages/profile.tsx

export async function getServerSideProps() {

    const res = await fetch(`http://localhost:3000/api/example`);
    const data = await res.json()

    console.log(data) // this logs: { userId: null } 

    return {
        props: {
            properties: data,
        },
    };
}


我的中间件文件:

middleware.ts

import { authMiddleware } from "@clerk/nextjs";
 
export default authMiddleware({
  publicRoutes: ["/api/example", "/profile"],
});
 
export const config = {
  matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)'],
};


有人能发现问题吗?我一整天都被困在这个问题上。谢谢你的关注

qfe3c7zg

qfe3c7zg1#

问题是从getServerSideProps()发出的请求将丢失任何标识头/cookie/等。
由于API路由处理程序和getServerSideProps()都运行在相同的服务器端上下文中,因此不需要发出额外的内部请求。
只需在getServerSideProps中使用getAuth()

export function getServerSideProps({ req }) {
  const { userId } = getAuth(req);

  return {
    props: {
      properties: { userId },
    },
  };
}

字符串

相关问题