Skip to content

常见业务场景

从真实业务出发,开箱即用的配置参考。

场景一:电商下单防重

使用 block 策略 + 自定义 key + 消息提示,防止同一笔订单被重复创建:

javascript
import axios from 'axios';
import { setupRequestGuard } from '@hydd/request-guard';

// 全局接入
const requestManager = setupRequestGuard(axios, {
  notify: (payload) => Toast.show(payload.message),
  defaults: {
    duplicate: {
      strategy: 'block',
      message: '订单处理中,请勿重复提交'
    }
  }
});

// 下单接口配置
const submitOrder = async (orderData) => {
  return axios.post('/api/order/create', orderData, {
    requestGuard: {
      duplicate: {
        strategy: 'block',
        // 以业务订单 ID 作为判重依据,同一订单 ID 只允许提交一次
        keyGenerator(config) {
          return `order:create:${config.data?.orderId}`;
        },
        message: '正在提交订单,请稍候'
      }
    }
  });
};

场景二:列表查询去重 + 自动重试

使用 reuse 策略 + 规则匹配 + 重试,相同查询自动复用,失败自动重试:

javascript
const requestManager = setupRequestGuard(axios, {
  rules: [
    {
      // 匹配所有列表查询接口
      url: /\/api\/(list|search|query)/,
      method: 'get',
      // 相同查询复用首次结果
      duplicate: {
        strategy: 'reuse',
        compareFields: ['method', 'url', 'params']
      },
      // 失败自动重试 2 次
      retry: {
        attempts: 3,
        delay: 500,
        backoff: 'exponential'
      }
    }
  ]
});

// 短时间内多次相同查询,只有第一次真正发出请求
// 失败后自动重试,所有等待方最终拿到相同结果
axios.get('/api/list', { params: { page: 1, size: 20 } });
axios.get('/api/list', { params: { page: 1, size: 20 } });

场景三:全局接入 + ARMS 监控 + 熔断保护

完整的生产环境配置示例:

javascript
import { setupRequestGuard, RequestGuardLogger, ConsoleRequestGuardLogger } from '@hydd/request-guard';

// 自定义 Logger:接入 ARMS 远程监控
class ARMSLogger extends RequestGuardLogger {
  write(event) {
    // event: { level, event, message, namespace, timestamp, data }
    __bl?.api(event.event, event.data);
  }
}

// 全局接入
const requestManager = setupRequestGuard(axios, {
  notify: (payload) => {
    Toast.show({ content: payload.message, type: 'warning' });
  },
  // 日志:生产环境用 ARMS,开发环境用 Console
  logger: process.env.NODE_ENV === 'production'
    ? new ARMSLogger({ devOnly: false, level: 'warn' })
    : new ConsoleRequestGuardLogger({ devOnly: true }),

  defaults: {
    retry: { attempts: 3, delay: 200, backoff: 'exponential' },
    circuitBreaker: {
      failCount: 5,
      window: 60000,
      recoverDelay: 30000,
      storage: 'session'  // 刷新页面后状态保留
    }
  },

  rules: [
    // 所有 POST 防重
    { method: 'post', duplicate: true },
    // 核心服务开启熔断
    { url: /\/api\/(payment|order|user)/, circuitBreaker: true }
  ]
});

基于 MIT 许可发布