错误:动态服务器使用情况:Next 13.4 上的标头

Dan*_*llo 4 javascript reactjs next.js next-auth

这是产生错误的函数。这是一个从会话中获取令牌的简单函数

  4 | 
  5 | export async function getUserToken() {
> 6 | const session = await getServerSession(authOptions)
    |                                       ^
  7 | 
  8 | return session?.user?.token
  9 | }
Run Code Online (Sandbox Code Playgroud)

我已经努力了几天,试图找出问题所在。到目前为止,我已经设法将其layoutpage试图让我们成为next-auths的 RSC 隔离getServerSession。我需要能够传递会话以在后端发出请求,每当我尝试使用需要会话的 api 调用填充客户端组件时,就会引发错误。

有任何见解或建议的解决方法吗?

这是需要请求填充的主要布局TeamSwitcher

export default async function RootLayout({ children, params: { lng } }: Props) {
  const clients = await getClients()
  return (
    <>
      <div className="flex flex-col">
        <div className="border-b">
          <div className="flex h-16 items-center px-4">
            {/* @ts-expect-error Server Component */}
            <MainNav
              lng={lng}
              title={siteConfig.name}
              items={siteConfig.mainNav}
            />
            <div className="ml-auto flex items-center space-x-4">
              <TeamSwitcher clients={clients} />
              {/* @ts-expect-error Server Component */}
              <UserNav lng={lng} user={user} />
            </div>
          </div>
        </div>
        {children}
      </div>
    </>
  )
}
Run Code Online (Sandbox Code Playgroud)

这是 api 调用,一切都非常简单

export async function getClients(): Promise<Client[]> {
  const token = await getUserToken()

  if (!token) throw Error("Missing token for request")

  return await api
    .headers({
      accept: "application/json",
      token,
    })
    .get("/clients")
    .json()
}
Run Code Online (Sandbox Code Playgroud)

小智 6

添加

\n
export const dynamic = "force-dynamic"\n
Run Code Online (Sandbox Code Playgroud)\n

到您获取ServerSession、Page、Layout 或Route Handler\xe3\x80\x82 的位置

\n

如果您直接使用此 api,而不是在 Route Hander 中,那么您需要将上述代码添加到调用它的每个页面,而如果您从组件内部调用它,则根据文档,它将无法工作。因此,如果您需要多次使用它,那么 Route Hander 是更好的选择。

\n

办公室文件

\n

服务器渲染通常发生在一个地方,因此获取与用户相关的数据需要是动态的。

\n

动态路由发生在获取一些数据之后,Next无法直接生成相应的页面或内容,所以同样需要动态指定。

\n