如何使用node-fetch发送cookie?

Ska*_*kay 24 javascript fetch node.js

我有nodejs应用程序处理用户的请求并接收我想代理到内部API服务的cookie.如何通过使用node-fetch来解决这个问题?

请不要提供superagent.

ple*_*and 32

您应该能够通过在请求的标头中设置cookie来传递cookie:

const opts = {
    headers: {
        cookie: 'accessToken=1234abc; userId=1234'
    }
};
const result = await fetch(`/some/url`, opts);
Run Code Online (Sandbox Code Playgroud)

  • 问题特别是关于节点获取库的,该库是针对节点环境而不是浏览器的。 (10认同)
  • 不适用于 Chrome 和 Firefox - 我在请求标头中没有看到 cookie。 (2认同)

zur*_*fyx 7

像机器人一样读写Cookie

async function login() {
  return fetch('<some_url>/login', {
      'headers': {
          'accept': '*/*',
          'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
          'cookie': '',,
      },
      'body': 'username=foo&password=bar',
      'method': 'POST',
  });
}

(async() => {
  const loginResponse = await login();
  const loginCookies = parseCookies(loginResponse);
})();
Run Code Online (Sandbox Code Playgroud)

您可能要包括:accept-languageuser-agentrefereraccept-encoding,等(请检查您的Chrome DevTools的示例请求)

出于某种原因,节点获取请求的结果cookie与新请求不兼容,但是我们可以这样解析它们:

function parseCookies(response) {
  const raw = response.headers.raw()['set-cookie'];
  return raw.map((entry) => {
    const parts = entry.split(';');
    const cookiePart = parts[0];
    return cookiePart;
  }).join(';');
}
Run Code Online (Sandbox Code Playgroud)

通过相同的标头在将来的请求中传递cookie:

  return fetch('<some_url>/dashboard', {
    'headers': {
        'accept': '*/*',
        'cookie': parsedCookies,
    },
    'method': 'GET',
  });
Run Code Online (Sandbox Code Playgroud)

  • “您可能希望包括:接受语言、用户代理、引用者、接受编码等(检查 Chrome DevTools 上的示例请求)”;专业提示,为您省去麻烦:在 Devtools 的 Network 选项卡中右键单击请求,选择复制,然后选择“Copy as fetch”并在编辑器中粘贴 fetch 函数调用代码。投票不足的答案顺便说一句。+1。 (7认同)