使用 AXIOS (Node.js) 在请求之间保留 cookie

Posted

技术标签:

【中文标题】使用 AXIOS (Node.js) 在请求之间保留 cookie【英文标题】:Perserve cookies between requests using AXIOS (Node.js) 【发布时间】:2020-12-26 16:43:47 【问题描述】:

$节点-v v10.15.0 "axios": "^0.19.2",

我试图阻止响应标头字段“set-cookie”中的 cookie - 就像浏览器一样。 我曾经使用过这个模块(https://www.npmjs.com/package/request),并且有一个选项 request.defaults(jar: true) 效果很好。

对于 axios,我要求 withCredentials: true 可以完成这项工作 - 但它没有。

这是一个示例代码:

axios( url: 'https://google.com/', method: 'get', withCredentials: true )
  .then((res) => 
    console.log('res.headers = ', res.headers);
  )
  .catch((err) => 
    console.log('ERROR >>>> ', err);
  );

axios( url: 'https://google.com/', method: 'get', withCredentials: true )
  .then((res) => 
    // console.log("res.headers = ", res.headers);
    console.log('REQUEST HEADERS: ', res.request._header);
  )
  .catch((err) => 
    console.log('ERROR >>>> ', err);
  );

控制台结果如下:

res.headers = 
  date: 'Tue, 08 Sep 2020 09:42:24 GMT',
  expires: '-1',
  'cache-control': 'private, max-age=0',
  'content-type': 'text/html; charset=ISO-8859-1',
  p3p: 'CP="This is not a P3P policy! See g.co/p3phelp for more info."',
  server: 'gws',
  'x-xss-protection': '0',
  'x-frame-options': 'SAMEORIGIN',
  'set-cookie': [
    '1P_JAR=2020-09-08-09; expires=Thu, 08-Oct-2020 09:42:24 GMT; path=/; domain=.google.com; Secure',
    'NID=204=hqIOtyoskrispJi7WvceHmix8PF_tVmV6FArMX_LwcvaFRNYzTj85TZp-MXsmOXL0STJBUX0LjsUXpuPF__yx7urLiXyxFKiFsi8RpPheqyrP4XNTwrHXqXPQVqxY0KEpO_XS9ITMVrMGJ5GBSfQB4Ii63o6x4icknqZ-1k4FA8; expires=Wed, 10-Mar-2021 09:42:24 GMT; path=/; domain=.google.com; HttpOnly',
  ],
  'alt-svc':
    'h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"',
  'accept-ranges': 'none',
  vary: 'Accept-Encoding',
  connection: 'close',
  'transfer-encoding': 'chunked',
;

REQUEST HEADERS: GET / HTTP/1.1 Accept: application/json, text/plain, */* User-Agent: axios/0.19.2 Host: www.google.com Connection: close

如您所见,第一个响应提供了许多要设置的 cookie,但连续请求不会发送它们。

如何让axios在请求之间保留cookie?

【问题讨论】:

您可以尝试将第二个 axios 请求移动到第一个的 .then 部分吗?我想知道第二个是否在收到第一个响应之前执行... Ping @Hairi - 你试过了吗? ***.com/questions/43002444/… 可能适合您的目的。或带有 cookie jar npm 包的 axios 【参考方案1】:

嗯...我懒得用辛苦的方式做事,所以我会做这样的事情,使用axios-cookie-jar-support:

const axios = require('axios').default;
const axiosCookieJarSupport = require('axios-cookiejar-support').default;
const tough = require('tough-cookie');
 
axiosCookieJarSupport(axios);
 
const cookieJar = new tough.CookieJar();
 
axios
  .get('https://google.com', 
    jar: cookieJar, // tough.CookieJar or boolean
    withCredentials: true, // If true, send cookie stored in jar
  )
  .then(() => 
    console.log(cookieJar);
  );

【讨论】:

以上是关于使用 AXIOS (Node.js) 在请求之间保留 cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中使用 axios 发布表单数据

如何在 node.js 中使用 axios 循环许多 http 请求

node.js中的后台数据请求mock,axios

Axios使用总结

Axios发送请求

Axios介绍和使用