【问题标题】:How to send cookies with node-fetch?如何使用 node-fetch 发送 cookie?
【发布时间】:2022-03-15 18:14:46
【问题描述】:

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

请不要提供超级代理。

【问题讨论】:

    标签: javascript node.js node-fetch


    【解决方案1】:

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

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

    【讨论】:

    • 不适用于 Chrome 和 Firefox - 我在请求标头中看不到 cookie。
    • 这个问题是关于 node-fetch 库的,它适用于 Node 环境而不是浏览器。
    【解决方案2】:

    像机器人一样读写 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);
    })();
    

    您可能希望包括: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(';');
    }
    

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

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

    【讨论】:

    • "您可能希望包括:accept-language、user-agent、referer、accept-encoding 等(检查您的 Chrome DevTools 上的示例请求)";专业提示,为您省去麻烦:在 Devtools 的 Network 选项卡中右键单击请求,选择复制,然后选择“Copy as fetch”并在编辑器中粘贴 fetch 函数调用代码。顺便说一句,投票不足的答案。 +1。
    【解决方案3】:

    为简单起见,您可以编写一个中间件,将 cookie 包含到 global.fetch,如下所示。

    const realFetch = fetch;
    
    function cookieFetch(fetch, cookie) {
      return (url, opts) => {
        opts = opts || {};
        return fetch(url, Object.assign(opts, {
          headers: Object.assign(opts.headers || {}, { cookie })
        }));
      };
    }
    
    function middleware(req, res, next) {
      const kuki = req.headers.cookie;
      global.fetch = kuki ?
        cookieFetch(realFetch, kuki) :
        realFetch;
      next();
    }
    
    module.exports = middleware;
    

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 2018-03-17
      • 2020-11-04
      • 1970-01-01
      • 2020-09-25
      • 2021-10-21
      • 2021-10-18
      • 1970-01-01
      • 2019-01-27
      相关资源
      最近更新 更多