You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS使用Got库跨请求共享登录会话Cookie的实现咨询

使用Got库实现跨请求Cookie复用方案

原代码问题说明

  • 仅提取了set-cookie数组的第一个值,登录接口通常会返回多个Cookie(会话标识、校验令牌等),需拼接所有有效Cookie后才能正常通过后续请求的身份校验
  • 登录请求用json格式传参,和PHP实现里的表单格式提交逻辑不一致,如果服务端仅支持表单格式的POST参数,登录请求会直接失败
  • 没有配置请求UA、自动跟随重定向逻辑,部分站点会校验这两项参数,缺少时会直接拦截请求
  • 没有对getData方法的异常做捕获,出错后无法定位问题根因

实现方案

方案1:手动处理Cookie

const got = require('got');
const constants = require('./你的常量配置文件路径');

// 登录方法
const login = async () => {
  const options = {
    prefixUrl: constants.BASEURL,
    // 如果服务端确实接收JSON格式参数,可改回json字段
    form: {
      email: constants.USER,
      pwd: constants.PASSWORD
    },
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    },
    followRedirect: true, // 对应PHP中的CURLOPT_FOLLOWLOCATION配置
    responseType: 'text'
  };
  return got.post(constants.LOGINURL, options);
};

// 拉取数据方法
const getData = async (cookieStr) => {
  const options = {
    prefixUrl: constants.BASEURL,
    headers: {
      'Cookie': cookieStr,
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    },
    followRedirect: true,
    responseType: 'text'
  };
  return got.post(constants.DATAURL, options);
};

// 主执行逻辑
(async () => {
  try {
    const loginRes = await login();
    // 拼接所有有效Cookie字段
    const cookieStr = loginRes.headers['set-cookie'].map(cookie => cookie.split(';')[0]).join('; ');
    const dataRes = await getData(cookieStr);
    console.log('拉取到的数据:', dataRes.body);
    // 此处处理返回的业务数据即可
  } catch (err) {
    console.log('请求出错:', err.message, err.response?.body);
  }
})();

方案2:自动管理Cookie(更推荐)

通过tough-cookie实现类似PHP中cookie.txt的自动Cookie管理能力,无需手动拼接参数:

const got = require('got');
const { CookieJar } = require('tough-cookie');
const constants = require('./你的常量配置文件路径');

// 初始化Cookie容器,自动存储、携带所有请求的Cookie
const cookieJar = new CookieJar();
// 生成复用的请求实例,统一配置公共参数,无需每个请求重复设置
const client = got.extend({
  prefixUrl: constants.BASEURL,
  cookieJar: cookieJar,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
  },
  followRedirect: true
});

// 主执行逻辑
(async () => {
  try {
    // 登录请求完成后Cookie会自动存入容器
    await client.post(constants.LOGINURL, {
      form: {
        email: constants.USER,
        pwd: constants.PASSWORD
      }
    });
    // 数据请求自动携带登录时存储的Cookie
    const dataRes = await client.post(constants.DATAURL);
    console.log('拉取到的数据:', dataRes.body);
  } catch (err) {
    console.log('请求出错:', err.message, err.response?.body);
  }
})();

内容的提问来源于stack exchange,提问作者Marco Grieco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:18:04