属性以字符串而不是对象的形式返回

4

我目前正在实现网站用户认证,尝试限制已登录用户访问登录和注册页面。为此,我正在实现此 getServerSideProps ,以便在用户已登录时将其重定向:

export async function getServerSideProps(context) {
  if (context.req.cookies.user) {
    return {
      redirect: {
        destination: '/',
        permanent: true,
      },
    }
  }
  return {}
}

如果我返回一个空对象 ({}),next 会给我这个错误:
Reason: Props must be returned as a plain object from getServerSideProps: `{ props: { ... } }` (received: `[object Array]`).

如果我返回的不是{},而是
{
  props: {}
}

这段代码运行正常,有人知道为什么会发生这种情况吗?

我正在使用自定义的_app.jsx文件。

在文档中,明确提到了props参数是可选的:Documentation


1
可能文档不正确或者不够清晰。他们提供的类似于你的示例返回 { props: {}}。也许他们的意思是 props 对象的内容是可选的?你可以在 Github 上创建一个问题。 - tromgy
好的,感谢你的帮助! - Vthechamp
2
@tromgy,虽然你说得对,但问题在于必须要返回 propsredirectnotFound 中的一个。在 OP 的情况下,由于他不想重定向或返回 404,所以必须返回 props。请参阅以下答案:https://dev59.com/gsPra4cB1Zd3GeqPgHFm#70823242。 - juliomalves
2个回答

3

这实际上是有意为之的。如果您使用的是TypeScript,return {}将抛出错误,因为GetServerSidePropsResult定义如下 (在此处):

export type GetServerSidePropsResult<P> =
  | { props: P | Promise<P> }
  | { redirect: Redirect }
  | { notFound: true }

这意味着返回的对象中必须有propsredirectnotFound之一。你可以在他们的GitHub上创建问题(可能还有PR)以修复文档。

1
这看起来没问题,文档应该说它是“这些属性中的任意一个”而不是“可选的”。 - choz

0

正如 @tromgy 所提到的,只是文档不够清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接