【发布时间】:2022-02-27 19:15:55
【问题描述】:
阅读以下帖子https://dev.to/chrsgrrtt/easy-user-authentication-with-next-js-18oe 并咨询以下问题Using next-iron-session's "withIronSession" with Next.JS to perform simple authentication 后,我仍然无法使用req.session.get('user') 访问会话。下面是我在 Next.js 项目中的实现:
创建一个工具
import {withIronSession} from 'next-iron-session';
const cookie = {
cookieName: process.env.COOKIE_NAME,
password: process.env.COOKIE_SECRET,
cookieOptions: {secure: process.env.NODE_ENV === 'production'},
};
export const guard = (handler) => {
return withIronSession(handler, cookie);
};
export default cookie;
创建 API 端点
const zlib = require('zlib');
import cookie from '@/utils/cookie';
const fetch = require('node-fetch');
import {withIronSession} from 'next-iron-session';
export default withIronSession(
async (req, res) => {
if (req.method === 'POST') {
try {
const request = await fetch(
process.env.NEXT_PUBLIC_API_BASE_URL + '/api/login',
{
method: 'post',
body: req.body,
headers: {
'Content-Type': 'application/json',
'Origin': req.headers.host || req.headers.origin,
},
}
);
const response = await request.text();
const {success, data, message} = JSON.parse(response);
// set JWT in session
compressor(data, (x) => req.session.set('user', x));
// persist session value
await req.session.save();
// console.log(req.session.get('user'));
return res.status(201).json({success, message});
} catch (error) {
console.log(error);
}
}
return res.status(404).json('Not found');
},
cookie
);
访问页面中的会话数据
export const getServerSideProps = guard(async (ctx) => {
const {req} = ctx;
const session = req.session.get();
console.log({session});
return {redirect: {destination: '/sign-in', permanent: false}};
});
上面的终端日志给出了一个空对象。是不是做错了什么?
【问题讨论】:
-
在你的 API 路由中,
compressor来自哪里?如果您在await req.session.save();之后立即将req.session.get("user")登录到控制台,您会得到什么? -
压缩器是一个函数,它使用 Node 的内置 Zlib 库压缩字符串,然后触发提供的回调。我得到保存在用户密钥中的会话中的值。
-
@mnengwa 你找到答案了吗?
标签: reactjs express next.js session-cookies