如何在不退出的情况下更新会话值?

Posted

技术标签:

【中文标题】如何在不退出的情况下更新会话值?【英文标题】:How to update session values without signing out? 【发布时间】:2021-03-25 00:34:33 【问题描述】:

使用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>
    </>
  </>

【问题讨论】:

嘿@Armel 你解决了这个问题吗?如果没有,我将创建一个赏金 嗨@airsoftFreak,很遗憾没有:( 【参考方案1】:

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

目前我还没有找到触发自动更新用户对象相对于数据库的函数。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您可以做的最好的事情是在将会话数据发送到客户端之前修改数据。 通过使用 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);
      ,
    ,

【讨论】:

以上是关于如何在不退出的情况下更新会话值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不影响剩余 TTL 的情况下更新 redis 值?

Groovy - 如何在不更新地图的情况下使用默认值获取地图值

如何在不更改 php 中旧日期值的情况下更新日期?

如何使用 jQuery 在不刷新页面的情况下更新 cookie 值?

如何在不注销的情况下清除所有会话变量

如何在不崩溃应用程序的情况下暂停/睡眠()功能?