美文网首页react
React 同构实践:服务端请求带 cookies

React 同构实践:服务端请求带 cookies

作者: lanberts | 来源:发表于2019-06-13 20:35 被阅读10次

前言

前段时间搭完 React 同构框架后,自以为很完美,还自我陶醉了好几天。结果,在接公司单点登录系统的时候立马现了原形。
公司的单点登录是用 cookie 实现的,传统的 spa 系统 cookie 由浏览器自动携带,不存在任何问题。
而 ssr ,是在服务器请求的接口,默认情况肯定带不了浏览器的 cookie,然而一些登录后的页面数据又必须要 cookie,这可怎么办?

思路

将 cookies 作为参数注入到组件的 loadData 方法,然后用传参数的方法把 cookies 传给 api。

1. cookie-parser 中间件解析 cookies

在项目启动文件中(server/index.js)引入 cookie-parser 中间件解析 cookies

const cookieParser = require('cookie-parser');

// 解析 cookie
app.use(cookieParser());

2. 将 cookies 作为参数传给 loadData 方法

let matchs = matchRoutes(router, request.path);
promises = matchs.map(({ route, match }) => {
  const loadData = route.loadData;
  // 携带上cookie,合并到 params 中,axios 中处理
  return loadData ? loadData(store, Object.assign(match.params, request.query, { cookies: request.cookies })) : Promise.resolve(null);
});

3. loadData 传给异步 action

loadData(store, params) {
  return store.dispatch(fetchTopList(params));
}

4. 发起请求

在异步 action 处理函数中带着 cookies 发起异步请求

export function fetchTopList(data) {
  return (dispatch) => {
    return getTopList(data).then(result => {
      dispatch(setTopList(result.topList));
    });
  };
}

5. axios 封装

在 axios 中解析出 params 携带的 cookies,并加到 axios 的 headers 里

const parseCookie = cookies => {
  let cookie = '';
  Object.keys(cookies).forEach(item => {
    cookie+= item + '=' + cookies[item] + '; ';
  });
  return cookie;
};

request(method) {
    return function (url, data = {}, opts = {}) {
      // 处理 cookie
      let cookies;
      if (data.cookies) {
        cookies = data.cookies;
        delete data.cookies;
        opts = Object.assign(opts, {
          headers: {
            Cookie: parseCookie(cookies)
          }
        });
      }

      return axiosCache[method](url, {
        ...opts,
        params: data
      });
    };
}

结尾

至此,就完成了服务端请求携带 cookie 的问题,但总觉得实现上有点麻烦,不知道是否有更好的办法?
希望大神能不吝指教...

相关文章

  • React 同构实践:服务端请求带 cookies

    前言 前段时间搭完 React 同构框架后,自以为很完美,还自我陶醉了好几天。结果,在接公司单点登录系统的时候立马...

  • React 同构实践

    前言 目前单页面应用(SPA)很是流行,同时也带了一些问题,如SEO不友好,首屏加载慢等,为了解决上述问题,所谓的...

  • 手把手教你ReactJS和VueJS的服务端渲染

    导语: 本文面向没用过服务端渲染以及没了解过的同学。主要介绍了服务端渲染的历史,以及React.js兴起以后的同构...

  • 手把手教你React.js和Vue.js的同构渲染

    导语: 本文面向没用过服务端渲染以及没了解过的同学。主要介绍了服务端渲染的历史,以及React.js兴起以后的同构...

  • Requests发送带cookies请求

    一、缘 起 最近学习【悠悠课堂】的接口自动化教程,文中提到Requests发送带cookies请求的方法,笔者随之...

  • React结合Graphql使用

    服务端 这一节只介绍react中的用法GraphQL 从入门到实践服务端github代码 安装 在你的react项...

  • cookies

    提取cookies 在post请求中传入cookies=cookies的参数

  • React 同构实践:结合 Redux

    前言 上一篇文章中,我们介绍了 React 同构的基本原理,但没有涉及数据获取方面。本章我们将结合 Redux 来...

  • 数据存储机制以及缓存

    存储机制 1. cookies存储机制 什么是cookie 当客户端向服务端发送请求后,服务端对客户端发送过来的信...

  • Request

    基于get请求 基于post请求 代理(proxies参数) Cookies和Session Cookies Se...

网友评论

    本文标题:React 同构实践:服务端请求带 cookies

    本文链接:https://www.haomeiwen.com/subject/ieosfctx.html