yikart/AiToEarn · warning · BadRequestException

只能选择一个参数: handle, userName, id 或 mine

Error message

只能选择一个参数: handle, userName, id 或 mine

What it means

YouTube Data API channel list semantics require exactly one filter selector. This controller validates that at most one of handle, userName, id, mine is provided; if more than one non-empty value is passed it throws BadRequestException '只能选择一个参数: handle, userName, id 或 mine' (choose only one parameter).

Source

Thrown at project/aitoearn-electron/server/src/modules/plat/youtube/youtube.controller.ts:152

  }


  @ApiOperation({ summary: '获取频道列表' })
  @Get('channels/list')
  async getChannelsList(
    @GetToken() token: TokenInfo,
    @Query('accountId') accountId: string,
    @Query('handle') handle?: string,
    @Query('userName') userName?: string,
    @Query('id') id?: string,
    @Query('mine') mine?: boolean
    ) {
    // 校验确保只有一个参数传递
    const params = [handle, userName, id, mine];
    const nonEmptyParams = params.filter(param => param !== undefined && param !== null && param !== '');

    if (nonEmptyParams.length > 1) {
      throw new BadRequestException('只能选择一个参数: handle, userName, id 或 mine');
    }
    const accessToken = await this.youtubeAuthService.getUserAccessToken(accountId);

    return this.youtubeService.getChannelsList(accessToken, handle, userName, id, mine);
  }

  @ApiOperation({ summary: '更新频道' })
  @Post('channels/update')
  async channelsUpdate(
    @GetToken() token: TokenInfo,
    @Body('accountId') accountId: string,
    @Body('id') id: string,
    @Body('brandingSettings') brandingSettings?: Record<string, any>,
    @Body('status') status?: Record<string, any>,
  ) {
    const accessToken = await this.youtubeAuthService.getUserAccessToken(accountId);
    return this.youtubeService.updateChannels(accessToken, id, brandingSettings, status);
  }

View on GitHub (pinned to d3aa8bea5b)

Solutions

  1. Send exactly one of: handle, userName, id, or mine per request
  2. Clear other filter params from the client state before switching filters
  3. Decide precedence server-side if multiple are supplied instead of erroring (optional UX improvement)

Example fix

// before
GET /api/plat/youtube/channels/list?accountId=acc1&mine=true&handle=@mychannel
// after
GET /api/plat/youtube/channels/list?accountId=acc1&handle=@mychannel
Defensive patterns

Strategy: validation

Validate before calling

const filters = { handle, userName, id, mine };
const count = Object.values(filters).filter(v => v !== undefined && v !== null && v !== '').length;
if (count > 1) throw new Error('Provide at most one of handle, userName, id, mine');
if (count === 0) throw new Error('Provide one of handle, userName, id, mine');

Try / catch

try {
  const channels = await api.get('/plat/youtube/channels/list', { params: buildParams() });
} catch (e) {
  if (e.response?.status === 400 && String(e.response.data?.message).includes('只能选择一个参数')) {
    params = pickSingleFilter(params); // keep highest-priority filter, retry
  }
}

Prevention

When it happens

Trigger: Calling GET channels/list with e.g. both mine=true and handle=@foo, or id=UC... together with userName, in the same request.

Common situations: Frontend keeps previous filter state in the query string while adding a new filter; default query params (mine) sent by a client library alongside an explicit handle; copy-pasting an example URL that already includes a filter.

Related errors


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