我正在使用Axios从客户端向Express.js服务器发送请求。

我在客户机上设置了一个cookie,我希望从所有Axios请求中读取该cookie,而不需要手动将它们添加到请求中。

这是我的客户端请求示例:

axios.get(`some api url`).then(response => ...

我试图通过在Express.js服务器中使用这些属性来访问头文件或cookie:

req.headers
req.cookies

它们都没有包含任何cookie。我使用cookie解析器中间件:

app.use(cookieParser())

如何让Axios在请求中自动发送cookie ?

编辑:

我在客户端设置cookie是这样的:

import cookieClient from 'react-cookie'

...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
      axios.get('path/to/my/cookie/api').then(response => {
        if(response.status == 200){
          cookieClient.save('cookie-name', response.data, {path:'/'})
        }
      })
    }
...

虽然它也使用Axios,但它与问题无关。我只是想在设置cookie后将cookie嵌入到所有请求中。


当前回答

法提赫的答案在2022年仍然有效。

axios.defaults.withCredentials = true也可以做到这一点。

将{withCredentials: true}传递给单独的axios调用似乎不建议使用。

其他回答

对于那些仍然无法解决这个问题的人,这个答案帮助了我。 Stackoverflow回答:34558264

TLDR; 我们需要在两个axios的GET请求和POST请求(获取cookie)以及fetch中设置{withCredentials: true}。

在尝试了2天之后,在尝试了这里的建议之后,这对我来说是有效的。

表达: Cors: Cors ({origin: "http:127.0.0.1:3000", credentials: true,}) Cookie:确保您的Cookie具有secure: true, sameSite: "None" 前端(反应)

axios.defaults.withCredentials = true; (withCredentials: true不适合我)到您请求cookie的地方以及您发送cookie的地方(GET/POST)

希望这也能帮助到其他人。

在package.json(Frontend)中设置代理,并重新启动服务器(问题解决)

另一个解决方案是使用这个库:

https://github.com/3846masa/axios-cookiejar-support

它将“Tough Cookie”支持集成到Axios中。注意,这种方法仍然需要withCredentials标志。

你可以使用withCredentials属性。

来自不同域的XMLHttpRequest不能为自己的域设置cookie值,除非在发出请求之前将withCredentials设置为true。

axios.get(BASE_URL + '/todos', { withCredentials: true });

此外,还可以对每个Axios请求强制凭据

axios.defaults.withCredentials = true

或者对某些Axios请求使用凭据,如下面的代码所示

const instance = axios.create({
   withCredentials: true,
   baseURL: BASE_URL
})
instance.get('/todos')