我正在使用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嵌入到所有请求中。


当前回答

对于任何这些解决方案都不起作用的人,请确保您的请求源等于您的请求目标,请参阅github问题。

简而言之,如果您在127.0.0.1:8000访问您的网站,那么请确保您发送的请求是针对127.0.0.1:8001的服务器,而不是localhost:8001,尽管理论上可能是相同的目标。

其他回答

//在创建axios实例时使用

const API = axios.create({
    baseURL: "http://localhost:4000", // API URL
    withCredentials: true,
});

//在后台的app.js中使用这个中间件 首先,安装NPM I cors

var cors = require("cors"); // This should be at the end of all middlewares

const corsOptions = {
    origin: "http://localhost:3000",
    credentials: true, //access-control-allow-credentials:true
    optionSuccessStatus: 200,
};

app.use(cors(corsOptions));

对我有用的是:

客户端:

import axios from 'axios';

const url = 'http://127.0.0.1:5000/api/v1';

export default {
  login(credentials) {
    return axios
      .post(`${url}/users/login/`, credentials, {
        withCredentials: true,
        credentials: 'include',
      })
      .then((response) => response.data);
  },
};

注意:凭证将是post请求的主体,在这种情况下,用户登录信息(通常从登录表单获得):

{
    "email": "user@email.com",
    "password": "userpassword"
}

服务器端:

const express = require('express');
const cors = require('cors');

const app = express();
const port = process.env.PORT || 5000;

app.use(
  cors({
    origin: [`http://localhost:${port}`, `https://localhost:${port}`],
    credentials: 'true',
  })
);

就我而言,问题出在cookie上,而不是Axios;虽然我接收和发送cookie从/到相同的域/子域/主机,我期望它在不同的路径上使用不同的资源-但我的cookie就像我已经设置了一个单一的路径,即使我省略了这个属性。显式地设置Path=/;在饼干里解决了这个问题。

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

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

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

对于任何这些解决方案都不起作用的人,请确保您的请求源等于您的请求目标,请参阅github问题。

简而言之,如果您在127.0.0.1:8000访问您的网站,那么请确保您发送的请求是针对127.0.0.1:8001的服务器,而不是localhost:8001,尽管理论上可能是相同的目标。