做出反应的cookie

Ugo*_*lai 16 cookies session reactjs express-session react-cookie

我需要知道我的用户是否已连接.为此,我想阅读我在服务器端使用快速会话设置的cookie:

app.use(session({
    secret: 'crypted key',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false } // Put true if https
  }))
Run Code Online (Sandbox Code Playgroud)

app.post('/connect_user', (req, res) => {
    req.session.cookie.username = req.body.username
    findUserData('username', req.body.username, req, (userData) => {
        req.session.cookie.id = userData.id
        req.session.cookie.username = userData.username
        res.redirect('/profil')
    })
})
Run Code Online (Sandbox Code Playgroud)

我尝试使用react-cookie,但它不起作用,但我复制/粘贴npm react-cookie doc:

import React from 'react';
import Landing from './Landing';
import Home from './Home';
import Profil from './Profil';
import {BrowserRouter as Router, Route} from 'react-router-dom'
import { instanceOf } from 'prop-types';
import { Cookies } from 'react-cookie';


class App extends React.Component {
    static propTypes = {
        cookies: instanceOf(Cookies).isRequired
      };
     
      constructor(props) {
        super(props);
     
        const { cookies } = props;
        this.state = {
          username: cookies.get('username')
        };
      }
    render() {
        console.log(this.state.name) 
        let homePage = (!this.state.username) ? <Landing/> : <Home/>
        return (
            <Router>
                <div>
                    <Route exact path='/' component={homePage}></Route>
                    <Route path='/profil' component={Profil}></Route>
                </div>
            </Router>
        )
    }
}

export default App;
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么不起作用?这很奇怪因为document.cookie给我带来了好结果,但我不知道如何处理它:PHPSESSID = 0nv9ic8h7pv2b63lu4v7eg3mop; USER_ID = 21; 用户名=乌戈; SL_G_WPT_TO = FR; SL_GWPT_Show_Hide_tmp =未定义; SL_wptGlobTipTmp =不确定

谢谢你的帮助!

小智 32

There is no need for a third party npm package. You can use plain JS to extract the cookie. Here is a custom function for that:

function getCookie(key) {
  var b = document.cookie.match("(^|;)\\s*" + key + "\\s*=\\s*([^;]+)");
  return b ? b.pop() : "";
}
Run Code Online (Sandbox Code Playgroud)


Sub*_*shu 30

您可以使用js-cookie包,并可以使用npm install js-cookie --save命令安装它.

import React from 'react';
import Cookies from 'js-cookie';

class App extends React.Component {
     this.state = {
        username: Cookies.get('username')
     }

//  more code....
}  
Run Code Online (Sandbox Code Playgroud)

文档:https://github.com/js-cookie/js-cookie

NPM:https://www.npmjs.com/package/js-cookie


Hun*_*ter 17

如果您只想通过键获取 cookie 值,我建议使用没有任何依赖项的普通 javascript。

在这个例子中,它在 Regex 的帮助下通过键“用户名”获取 cookie 值。

let cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)username\s*\=\s*([^;]*).*$)|^.*$/, "$1");
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/API/document/cookie#Example_2_Get_a_sample_cookie_named_test2


fuk*_*it0 15

您还可以使用以下方法,而不使用任何第 3 方包,如developer.mozilla.org中所述:

const cookieValue = document.cookie
  .split('; ')
  .find((row) => row.startsWith('YOUR-COOKIE='))?
  .split('=')[1];
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您有一个具有“httpOnly:true”属性的 cookie,则无法使用 document.cookie 访问它。这可能是您使用这些方法无法访问 cookie 的原因。


Mat*_*ara 6

我建议使用universal-cookies它,因为它更易于使用。请注意,cookie与React无关。它们存储在浏览器中,您可以使用浏览器的默认API获取Cookie。

这是一个如何使用的示例 universal-cookies

import React from 'react';
// other imports...
import Cookies from 'universal-cookie';

const cookies = new Cookies();

class App extends React.Component {
     this.state = {
        username: cookies.get('username')
     }

//  more code....   
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.npmjs.com/package/universal-cookie

  • 为什么人们不断添加这个???`class App extends React.Component {` 这在实际代码中不存在 (2认同)
  • @uberrebu 答案是在 2018 年写的。这就是在函数组件和钩子之前声明组件的方式,这很常见 (2认同)