我有一个页面,用户可以给自己一个“角色”,如成员或管理员。他们可以转到另一条路径来创建消息。我试图更新用户的角色从“用户”到“管理”。它将req.session更新为admin.js文件中的管理角色,但当我转到messages/create.js并尝试记录req.session时,它将显示用户仍然具有" user“角色。我正在通过调用req.session.save()来保存我所做的更改,但是它不起作用。
admin.js
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
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)请让我知道问题是什么,以及如何解决它。谢谢
发布于 2022-10-19 18:50:00
通过查看代码,我注意到的第一件事是,您没有将响应发送回客户端。铁会话使用cookie来管理无状态身份验证,以及通过设置response header来管理的方式。因为您没有发送响应,所以它无法更新会话。
进一步查看API文档,session.save() --“保存会话,并在响应发送后将cookie头设置为。”
由于不了解您的完整实现,或者没有类似于codesandbox.io的工作代码示例,我建议使用下面的代码来查看这是否解决了您的问题。
// 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示例。
代码示例显示:
一些方面注意到:如果您正在执行类似const sessionData = req.session.user的操作,然后尝试更改req.session.user,然后将数据发回,它将无法工作,因为每个请求都将重新创建会话对象,而且节点不能将req.session存储为引用。
如果我的演示没有帮助您,那么您将不得不共享更多的信息和代码,并可能创建一个代码框,以复制您正在发生的。
https://stackoverflow.com/questions/73883839
复制相似问题