¿Cómo enviar cookies con node-fetch?

2 minutos de lectura

Avatar de usuario de Skay
patinar

Tengo la aplicación nodejs que maneja las solicitudes de los usuarios y recibe cookies que quiero enviar al servicio API interno. ¿Cómo abordar esto usando node-fetch?

No ofrezca superagente por favor.

Debería poder pasar cookies configurándolo en el encabezado de su solicitud:

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

  • No funciona en Chrome y Firefox. No veo cookies en los encabezados de mis solicitudes.

    – Vitaly Zdanévich

    15 de enero de 2019 a las 12:49


  • La pregunta es específicamente sobre la biblioteca de búsqueda de nodos que está destinada a entornos de nodos, no al navegador.

    – plemarquand

    16 de enero de 2019 a las 13:08

avatar de usuario de zurfyx
zurfyx

Leer y escribir cookies como un bot

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);
})();

Es posible que desee incluir: accept-language, user-agent, referer, accept-encodingetc. (verifique una solicitud de muestra en sus Chrome DevTools a través de la pestaña Red)

Por alguna razón, las cookies resultantes de las solicitudes de búsqueda de nodos no son compatibles con las nuevas solicitudes, pero podemos analizarlas así:

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(';');
}

Pase cookies en sus futuras solicitudes a través de los mismos encabezados:

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

  • “Es posible que desee incluir: idioma de aceptación, agente de usuario, referente, codificación de aceptación, etc. (verifique una solicitud de muestra en sus Chrome DevTools)”; consejo profesional, para ahorrarle la molestia: haga clic con el botón derecho en la solicitud en la pestaña Red en Devtools, seleccione copiar, luego seleccione “Copiar como búsqueda” y pegue el código de llamada de la función de búsqueda en el editor. respuesta poco votada por cierto. +1.

    – Sabiduría

    10 de junio de 2019 a las 18:42


Avatar de usuario de Caojs
Caojs

Para simplificar, puede escribir un middleware que incluirá las cookies en global.fetch, como se muestra a continuación.

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;

¿Ha sido útil esta solución?