NodeJS使用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
相关产品推荐
相关产品推荐

