【问题标题】:Access session data in Next.js page using withIronSession()使用 withIronSession() 访问 Next.js 页面中的会话数据
【发布时间】: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


【解决方案1】:

尝试以下方法:

export const getServerSideProps = guard(async function ({
  req,
  res,

  query,
}) {
//Assuming you have "user" session object
const user = req.session.get("user");
...
});

哈雷尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2011-03-27
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多