reactjs - 如何在不退出的情况下更新会话值?
问题描述
使用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>
</>}
</>
}
解决方案
您可以做的最好的事情是在将会话数据发送到客户端之前修改数据。通过使用 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);
},
},
推荐阅读
- qt - 如何使用 QML 从列表视图页面获取单个项目详细信息页面?
- javascript - Strapi 电子邮件返回 AssertionError [ERR_ASSERTION]:无法包装非错误对象
- javascript - 在 bootstrap-table 的 data-formatter 函数中显示 php 数据
- angular - 为什么 Angular 8 CircleCI 构建在执行 ng test --watch-false 时失败,业力配置为 singleRun=true?
- java - Google 在 Appcompactivity - Android 中对 AutoCompleteTextView 进行 api 调用
- mongodb - 使用 $pull 从用户模型中拉出对象,遇到多个对象项的问题
- angular - 如何以角度合并/合并数组内的数组
- prometheus - Prometheus 基于一天中的时间查询
- mysql - 查询特定科目通过或未通过的学生
- excel - 将 mdb 到 accdb 转换为 excel vba