next-auth 中 useSession() 的“加载”返回值是啥?

Posted

技术标签:

【中文标题】next-auth 中 useSession() 的“加载”返回值是啥?【英文标题】:What is the 'loading' return value from useSession() in next-auth?next-auth 中 useSession() 的“加载”返回值是什么? 【发布时间】:2020-10-29 11:35:46 【问题描述】:

我正在编写一个 Next.js 项目,并使用 GitHub 和 next-auth 实现身份验证。在next-auth 的示例中,有一个对useSession() 的调用,它返回两个对象:sessionloading。但是,我看到的所有示例都没有真正使用loading 对象。

import React from 'react'
import  
  useSession, 
  signin, 
  signout 
 from 'next-auth/client'

export default () => 
  const [ session, loading ] = useSession()

  return <p>
    !session && <>
      Not signed in <br/>
      <button onClick=signin>Sign in</button>
    </>
    session && <>
      Signed in as session.user.email <br/>
      <button onClick=signout>Sign out</button>
    </>
  </p>

问题loading的用途是什么,在实践中是如何使用的?

【问题讨论】:

【参考方案1】:

loading 选项表示会话状态正在更新;获取会话数据时为true,完成检查时为false

这有点复杂,因为 session 属性即使在加载时也可以被填充(例如,因为它已经有一个可以从以前的调用中使用的缓存值),所以从技术上讲,session 即使在 @987654326 时也可以填充@ 是true

如果在 pages/_app.js 中使用 NextAuth.js 提供程序,如果在 getInitialProps()getServerSideProps() 中调用了 getSession(),则还可以填充从 useSession 返回的 session 对象。

如果您有一个活动会话,诸如窗口获得或失去焦点之类的操作将导致 NextAuth.js 在后台再次检查会话状态,以尝试确保它不是陈旧的。

tl;博士

当您检查loading 时,您可能还想首先检查session 不是null。如果session 状态是一个对象,则用户有一个有效的会话,您无需等待loading 返回。

但是,如果 sessionnull 并且 loadingfalse 那么他们肯定没有活动会话。

【讨论】:

在调用signIn() 之后,我期待loading 成为true。我想用它在登录提交按钮上显示一个微调器,而signIn() 做了它的事情。 但我必须知道signIn()(还有singOut()loading 没有任何影响。 可能我有一个严重的误解。也许有人可以为我清除迷雾.. @Tobi 我认为这是一个公平的假设!我不确定它确实如此,但它似乎是完全合理的预期,如果它没有发生,我认为我们可以改变它。调用 signIn()signOut() 应该 更改当前会话状态,但是 - 正如你所说 - 我不确定它是否真的改变了 loading 值。

以上是关于next-auth 中 useSession() 的“加载”返回值是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 next-auth 中制作自定义电子邮件登录页面时找不到“next-auth/react”模块

如何从请求中解析 JWT 令牌 [Next-Auth]

Next Auth useSession 在初始页面加载时返回未定义

如何在 Next.js 中使用 next-auth 实现凭据授权?

如何在 nextjs 组件中使用 next-auth?

会话中的 Next-Auth 用户对象为其值返回 null