有反应的饼干

我需要知道我的用户是否连接。为此,我想阅读我在服务器端用 Express-session 设置的 cookie:

app.use(session({
secret: 'crypted key',
resave: false,
saveUninitialized: true,
cookie: { secure: false } // Put true if https
}))
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')
})
})

我尝试使用 react-cookie,但它不工作,即使我复制粘贴的 npm react-cookie文档示例:

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;

这很奇怪,因为 document.cookie呈现的是正确的结果,但我不知道如何处理它:

PHPSESSID=0nv9ic8h7pv2b63lu4v7eg3mop; user_id=21; username=Ugo; SL_G_WPT_TO=fr; SL_GWPT_Show_Hide_tmp=undefined; SL_wptGlobTipTmp=undefined
213935 次浏览

我建议使用 universal-cookie,因为它使用起来更简单。提醒你一下,饼干和“反应”没有任何关系。它们存储在浏览器中,您可以使用浏览器的默认 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....

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

您可以使用 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....
}

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

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

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

在这个示例中,它在 Regex 的帮助下通过键“ username”获取 cookie 值。

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

Https://developer.mozilla.org/en-us/docs/web/api/document/cookie#example_2_get_a_sample_cookie_named_test2

不需要第三方 npm 包。您可以使用普通的 JS 来提取 cookie。下面是一个自定义函数:

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

您也可以使用下面的方法,而不需要任何第三方软件包,如 Developer.mozilla.org中所记录的:

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

我希望这个功能可以帮上忙:

function getCookie(name) {
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
cookie = key=>((new RegExp((key || '=')+'=(.*?); ','gm')).exec(document.cookie+'; ') ||['',null])[1]
console.log(cookie('test'))