如何在node-fetch中通过response对象获取对应的request请求对象
node-fetch 从response获取request对象的支持情况
结论
node-fetch 支持从response对象获取关联的request信息,具体用法受版本影响:
1. v3.x版本(推荐)
v3.x默认已将请求对象挂载到response.request属性,你可以直接读取对应属性,不需要额外配置。注意response.request是同步属性,不需要加await调用:
import fetch from 'node-fetch'; const response = await fetch('https://example.com/api', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ foo: 'bar' }), agent: yourCustomAgent }); if (!response.ok) { // 直接读取请求相关信息用于重试 const request_headers = response.request.headers; const request_url = response.request.url; const request_body = response.request.body; const request_agent = response.request.agent; }
2. v2.x版本
v2.x默认没有暴露response.request属性,可通过两种方式实现需求:
- 方案1:发起请求前提前存储请求参数
const fetch = require('node-fetch'); const requestUrl = 'https://example.com/api'; const requestOptions = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ foo: 'bar' }), agent: yourCustomAgent }; const response = await fetch(requestUrl, requestOptions); if (!response.ok) { // 直接读取预存的请求参数即可 const request_headers = requestOptions.headers; const request_url = requestUrl; // ...其他属性从requestOptions中读取 }
- 方案2:封装fetch方法,自动挂载request属性到response,后续使用和v3完全一致
const originalFetch = require('node-fetch'); const fetch = async (url, options = {}) => { const response = await originalFetch(url, options); // 手动挂载请求信息 response.request = { url, method: options.method || 'GET', headers: options.headers || {}, body: options.body, agent: options.agent }; return response; }; // 后续使用示例 const response = await fetch('https://example.com/api', {}); console.log(response.request.url);
注意:如果请求body为流格式,读取一次后就无法复用,做重试逻辑时建议提前将body缓存为字符串、Buffer等可重复读取的格式再传入。
内容的提问来源于stack exchange,提问作者professrr
相关产品推荐
相关产品推荐

