javascript - 刷新页面时 session 丢失(Next、react、同构)

标签 javascript reactjs fetch isomorphic-javascript next.js

我正在使用 zeit next 来制作一个带有 React 的同构应用程序,并使用带有 express-session(在其他服务器中)的 express 来制作 API。

此组件应从 API (request.get(' http://0.0.0.0:3100/private ')) 请求私有(private)数据,并在用户登录时显示私有(private)页面,否则重定向到登录页面。

在客户端这有效,但是当我刷新私有(private)页面时,我被重定向到登录,因为客户端和服务器端的 session cookie 不同。 ¿我该如何解决这个问题?

const Private = (props) => {
    return (
        <main>
            <h1>Private </h1>
            <Link href="/">
                <a>Home</a>
            </Link>
        </main>
    );
}

Private.getInitialProps = async ({ res }) => {
    // getInitialProps is ejecuted in server side when you refresh the page (first time) 
    // but if you navigate in client side it is ejecuted in client. Server side and client
    // have a different session for API calls. Is posible to share the session by client
    // and server side? 
    const response = await request.get('http://someDomain/private');

    let body;
    if (response.status !== 401) {
        body = await response.json();
    } else {
        if (res) {
            res.writeHead(302, { Location: '/login' })
            res.end()
        } else {
            Router.push('/login')
        }
    }

    return {}
}

export default Private;

最佳答案

@PacoRampus as @neerajdngl said 刷新页面时,您的 cookie 被传递到 express 服务器,而不是在浏览器中。因此,您将被重定向到登录页面。

你可以这样做:

    Private.getInitialProps = async ({ req, res }) => {
        let Cookie;
        if (req) {
            Cookie = encodeURIComponent(req.cookies.your_token_name);
        } else {
            Cookie = '';
        }

        let yourCookie= 'token=' + Cookie;

       const response = await fetch('http://someDomain/private', {
            credentials: 'include',
            headers: {Cookie: yourCookie}
        }));

        let body;
        if (response.status !== 401) {
            body = await response.json();
        } else {
            if (res) {
                res.writeHead(302, { Location: '/login' })
                res.end()
            } else {
                Router.push('/login')
            }
        }

        return {}
    }

你的 server.js 文件应该有这样的代码:

server.get('/yourPrivatePage', (req, res) => {
            return app.render(req, res, '/yourPrivatePage', req.query)
        });

希望这对你有用。

关于javascript - 刷新页面时 session 丢失(Next、react、同构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45894278/

相关文章:

reactjs - 如何在reactjs中显示来自laravel存储的图像

reactjs - React Generic Props 在 props 中使用函数时出现错误

javascript - 实现全面的快速路由解决方案后,获取 API 调用失败 : Unexpected token < in JSON at position 0

javascript - ReactJS 获取 - 正文 : json. stringify

javascript - 获取相同的数据到两个选择元素

javascript - 使用 HTML 和 CSS 绘制带有填充的圆弧

javascript - 压缩 Json JavaScript

javascript - Facebook 在用户登录之前给出响应

javascript - 一组随机数

reactjs - 如何在 react 组件中指定样式 block ?