yikart/AiToEarn · warning · Error

请求失败: 超过最大重试次数

Error message

请求失败: 超过最大重试次数

What it means

A defensive, nominally unreachable throw after the while (retryCount < maxRetries) loop in postFormData (project/aitoearn-electron/electron/plat/douyin/index.ts:2391). The loop should always either return a parsed result or throw; this exists only for TypeScript control-flow/type safety so the method's Promise<any> return type is satisfied. Reaching it would imply a logic flaw (e.g. maxRetries <= 0).

Source

Thrown at project/aitoearn-electron/electron/plat/douyin/index.ts:2391

      } catch (error) {
        if (retryCount < maxRetries - 1) {
          retryCount++;
          console.log(
            `请求失败,${retryDelay / 1000}秒后进行第${retryCount}次重试...`,
          );
          await new Promise((resolve) => setTimeout(resolve, retryDelay));
          continue;
        }

        console.error(`请求发生错误:`, error);
        throw new Error(
          `请求失败: ${error instanceof Error ? error.message : String(error)}`,
        );
      }
    }

    // 这里不应该被执行到,但为了类型安全添加
    throw new Error('请求失败: 超过最大重试次数');
  }

  // 点赞
  async creatorDianzanOther(
    cookie: Electron.Cookie[],
    data: any,
  ): Promise<{
    extra: {
      fatal_item_ids: string[];
      logid: string; // '2025040322304072588F91E9D7AE3AA42B';
      now: number; // 1743690640000;
    };
    log_pb: {
      impr_id: string; // '2025040322304072588F91E9D7AE3AA42B'
    };
    status_code: number; // 0;
    is_digg: number; // 0;
  }> {

View on GitHub (pinned to d3aa8bea5b)

Solutions

  1. Ensure retryOptions.maxRetries is at least 1 at every call site (or omit it to use the default of 3).
  2. If you see this in production, audit how retryOptions is computed/passed — a 0/negative value is leaking through.
  3. As a library hardening step, clamp maxRetries with Math.max(1, retryOptions.maxRetries || 3) at the top of postFormData.

Example fix

// before
const maxRetries = retryOptions.maxRetries || 3;
// after
const maxRetries = Math.max(1, retryOptions.maxRetries ?? 3);
Defensive patterns

Strategy: validation

Validate before calling

const retryOptions = { maxRetries: Math.max(1, userMaxRetries ?? 3), retryDelay: userRetryDelay ?? 2000 };

Type guard

function hasValidRetryOptions(o: { maxRetries?: number; retryDelay?: number } | undefined): boolean {
  return !o || (typeof o.maxRetries === 'number' ? o.maxRetries >= 1 : true);
}

Try / catch

try {
  const result = await douyinService.someOp(cookie, data);
} catch (e) {
  if (String(e.message).includes('超过最大重试次数')) {
    // indicates maxRetries <= 0 was passed; fix the retryOptions source
  } else throw e;
}

Prevention

When it happens

Trigger: Practically only when postFormData is invoked with retryOptions.maxRetries set to 0 or a negative number, making the while loop body never execute and control fall straight through to this line.

Common situations: A caller passing { maxRetries: 0 } by mistake thinking it disables retries; a refactor that changes loop guards; normally unreachable in production.

Related errors


AI-assisted analysis of yikart/AiToEarn@d3aa8bea5b (2026-08-31). Data as JSON: /api/errors/38eecac1587e96e0. Report an issue: GitHub.