首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铁会话没有更新req.session对象

铁会话没有更新req.session对象
EN

Stack Overflow用户
提问于 2022-09-28 15:10:27
回答 1查看 162关注 0票数 1

我有一个页面,用户可以给自己一个“角色”,如成员或管理员。他们可以转到另一条路径来创建消息。我试图更新用户的角色从“用户”到“管理”。它将req.session更新为admin.js文件中的管理角色,但当我转到messages/create.js并尝试记录req.session时,它将显示用户仍然具有" user“角色。我正在通过调用req.session.save()来保存我所做的更改,但是它不起作用。

admin.js

代码语言:javascript
复制
import { withIronSessionApiRoute } from "iron-session/next";
import nc from "next-connect";
import { session_config } from "../../lib/config";
import Users from "../../models/user";
import { connectToDatabase } from "../../util/mongodb";

const handler = nc()

handler.post(async (req) => {
    if (req.body.password === process.env.ADMIN_PASSWORD) {
        await connectToDatabase()
        await Users.findOneAndUpdate({ name: req.session.user.name }, { role: "admin" })
        const updated_user = { name: req.session.user.name, role: "admin" }

        req.session.user = updated_user
        await req.session.save()

    }

})

export default withIronSessionApiRoute(handler, session_config);

消息/Create.js

代码语言:javascript
复制
import { withIronSessionApiRoute } from "iron-session/next";
import nc from "next-connect";
import { session_config } from "../../../lib/config";

const handler = nc()
handler.post(async (req) => {
    console.log(req.session.user)
    console.log(req.body)
})

export default withIronSessionApiRoute(handler, session_config)

请让我知道问题是什么,以及如何解决它。谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-10-19 18:50:00

通过查看代码,我注意到的第一件事是,您没有将响应发送回客户端。铁会话使用cookie来管理无状态身份验证,以及通过设置response header来管理的方式。因为您没有发送响应,所以它无法更新会话。

进一步查看API文档session.save() --“保存会话,并在响应发送后将cookie头设置为。”

由于不了解您的完整实现,或者没有类似于codesandbox.io的工作代码示例,我建议使用下面的代码来查看这是否解决了您的问题。

代码语言:javascript
复制
// please make sure that `res` is a parameter on the `.post()` function 
// on your original code. I've already set it as shown below.

handler.post(async (req, res) => {
    if (req.body.password === process.env.ADMIN_PASSWORD) {
        await connectToDatabase()
        await Users.findOneAndUpdate({ name: req.session.user.name }, { role: "admin" })
        const updated_user = { name: req.session.user.name, role: "admin" }

        req.session.user = updated_user
        await req.session.save()
        // response below
        res.send({ ok: true })
        // or if you don't want to send custom data back, comment the line above,
        // and then uncomment the line below
        // res.status(200).end()
    }
})

企图2

我使用一些来自Codesandbox上的铁会话演示的演示代码制作了一个铁会话回购NextJs示例

代码示例显示:

  • 登录
  • 注销
  • 将用户设置为管理员
  • 从服务器端获取用户数据
  • 从客户端获取用户数据
  • 使用SWR进行抓取

一些方面注意到:如果您正在执行类似const sessionData = req.session.user的操作,然后尝试更改req.session.user,然后将数据发回,它将无法工作,因为每个请求都将重新创建会话对象,而且节点不能将req.session存储为引用。

如果我的演示没有帮助您,那么您将不得不共享更多的信息和代码,并可能创建一个代码框,以复制您正在发生的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73883839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档