8

使用NextAuth.js,如何在不注销并再次登录的情况下更新会话对象中的值?

例如,一旦用户登录,我将使用会话中存储的 URL 来显示用户的头像。

我还为用户提供更改他的头像,所以我希望session.user.image使用头像的新路径进行更新和持久化。我将所有数据存储在 MongoDB 中。我怎样才能做到这一点?现在唯一的解决方案是要求用户退出并重新登录,但这听起来对我来说不是一个可以接受的解决方案:)

我的第一个想法是在用户更新他的头像后更新这个会话对象,但我不知道如何做到这一点。

import React from 'react'
import { signIn, signOut, useSession } from 'next-auth/client'

export default function Page() {
  const [ session, loading ] = useSession()

  return <>
    {session && <>
      <img src={session.user.image} />
      <button onClick={signOut}>Sign out</button>
    </>}
  </>
}
4

3 回答 3

0

您可以做的最好的事情是在将会话数据发送到客户端之前修改数据。通过使用 next-auth 会话回调,我们可以轻松地做到这一点。

callbacks: {
      session: async (session, user) => {
      
        const userDatabase = await CreateAccount.findOne({
          email: user.email,
        }); //finding user in DB.
        
        const userData = {
          name: userDatabase.username,
          email: userDatabase.email,
          image: userDatabase.avatar,
          id: userDatabase._id,
        } // creating payload
        
        session.user = userData; //sending payload as session
        
        return Promise.resolve(session);
      },
    },

于 2021-11-10T19:13:53.670 回答
0

一种可能的解决方案是手动更新用户对象。检查以下链接以了解下一个身份验证的回调如何工作https://next-auth.js.org/configuration/callbacks - 一种可能的方法是在 jwt()/session() 中更新用户回调并自行调整用户信息。

至于现在我还没有找到一个函数来触发与数据库相关的用户对象的自动更新。

于 2021-03-10T20:35:00.660 回答
0

在我的情况下,我在我的网站上进行 apyment 之后我想在我做 session.user.subscribe=true 时修改会话;如果我不重新加载页面,它的工作原理,当我重新加载页面时,我得到 previos vale subscribe=false,现在根据 ui 可以通过回调中的用户修改会话,但是我怎么知道付款已经在那些回调,我们此刻被困住了。

如果我注销并重新登录,我在会话中的订阅值将自动更新

于 2021-05-12T05:49:36.210 回答