通过封装一个支持重试和故障转移的异步函数,可以在主接口请求失败时自动切换到备用接口。具体做法是定义一个包含主备url列表的配置对象,在请求抛出异常或返回非成功状态码时,依次尝试列表中的下一个地址,直到获取有效响应或耗尽所有备选方案。

如何配置并执行带有故障转移逻辑的请求
实现该功能的核心在于捕获网络错误或HTTP错误,并在catch块中触发对备用URL的重试。我们创建一个名为`fetchWithFailover`的函数,它接收目标资源标识和一组候选URL。当第一个URL请求失败时,函数会递归或循环调用自身处理剩余的URL列表,从而确保只要有一个接口可用,就能返回数据。

async function fetchWithFailover(resource, urls) {
if (urls.length === 0) {
throw new Error('All endpoints failed');
}
const [primaryUrl, ...backupUrls] = urls;
try {
const response = await fetch(primaryUrl);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.warn(`Primary endpoint ${primaryUrl} failed. Trying backup...`, error.message);
// 递归调用,传入剩余的备用URL
return fetchWithFailover(resource, backupUrls);
}
}
// 使用示例
const endpoints = [
'https://api.primary.com/data',
'https://api.backup.com/data',
'https://api.fallback.com/data'
];
fetchWithFailover('/users', endpoints)
.then(data => console.log('Success:', data))
.catch(err => console.error('Final Failure:', err));
上述代码展示了基本的故障转移流程。首先尝试`primaryUrl`,如果`fetch`抛出异常(如网络断开)或者响应状态码不在200-299之间,则进入catch块。在catch块中,我们将剩余URL组成的数组再次传给函数,实现链式切换。最终如果所有URL都失败,将抛出“All endpoints failed”错误。
如何处理不同接口的数据格式差异
在实际场景中,备用接口可能由不同团队维护,其返回的数据结构可能与主接口不一致。因此,在切换接口后,需要对返回数据进行标准化处理,以确保下游业务逻辑的一致性。这通常涉及在获取到JSON数据后,立即进行字段映射或类型校验。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

function normalizeData(rawData, source) {
if (source === 'primary') {
return {
id: rawData.userId,
name: rawData.fullName,
status: rawData.isActive ? 'active' : 'inactive'
};
} else {
// 备用接口数据结构不同
return {
id: rawData.id,
name: rawData.username,
status: rawData.accountStatus
};
}
}
async function fetchWithNormalization(urls) {
let lastError;
for (let i = 0; i <p>这段代码引入了`normalizeData`函数来统一输出格式。在`fetchWithNormalization`中,我们使用循环替代递归,以便更灵活地记录错误信息。每次成功获取数据后,根据来源URL判断使用哪种映射规则,将异构数据转换为统一的内部模型。这样即使备用接口字段名不同,上层组件也能获得一致的数据结构。</p><h2>基于程序中某个输入、条件或结果的具体问题</h2><p>当备用接口也返回非200状态码(例如503 Service Unavailable)时,程序的行为取决于具体的错误处理逻辑。在上述`fetchWithFailover`实现中,只要`response.ok`为false,就会抛出错误并触发下一次重试。这意味着如果备用接口暂时不可用,系统会自动尝试再下一个备用节点,而不是直接崩溃。这种设计确保了在高可用场景下,只要有一个节点存活,请求就能完成。</p>
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










