yikart/AiToEarn · error · AppHttpException

fail

fail

Error message

fail

What it means

Generic failure AppHttpException thrown from the admin task-material update endpoint. It means the material id given in PUT /material/:id does not correspond to any stored task material record. The controller checks getTaskMaterialById first and throws ErrHttpBack.fail before any update happens.

Solutions

  1. Verify the material id exists via the task material list/get endpoint before calling PUT material/:id.
  2. Check you are not passing a task id instead of a task-material id.
  3. Confirm the admin client is pointed at the same environment/database where the material was created.
  4. If the generic 'fail' code is unhelpful, replace it with a more specific ErrHttpBack entry for not-found materials.

Example fix

// before
const info = await this.adminTaskService.getTaskMaterialById(id);
if (!info) throw new AppHttpException(ErrHttpBack.fail);
// after
const info = await this.adminTaskService.getTaskMaterialById(id);
if (!info)
  throw new NotFoundException(`Task material ${id} not found`);
Defensive patterns

Strategy: validation

Validate before calling

const info = await api.getTaskMaterialById(id);
if (!info) throw new Error(`Skip update: material ${id} not found`);
await api.put(`/material/${id}`, body);

Type guard

function isMaterial(m: unknown): m is { id: string } {
  return !!m && typeof m === 'object' && typeof (m as any).id === 'string';
}

Try / catch

try {
  await api.put(`/material/${id}`, body);
} catch (e) {
  if (e.response?.data?.code === 'fail') {
    console.warn(`Material ${id} not found; refreshing list`);
    await refreshMaterialList();
  } else throw e;
}

Prevention

When it happens

Trigger: PUT material/:id (admin task routes) with an id that is not a valid existing task-material id: already-deleted material, malformed/typo id, or an id belonging to another collection.

Common situations: Stale client caches referencing deleted materials, copy-pasting an id of the wrong entity type (task id vs material id), or testing against a different database than the one the material was created in.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at project/aitoearn-electron/server/src/modules/task/adminTask.controller.ts:130

    @Query() query: PagerDto,
  ) {
    return this.adminTaskService.findTaskMaterialList(taskId, query);
  }

  // 添加任务素材列表
  @Post('material')
  async addTaskMaterial(@Body() body: ActionTaskMaterialDto) {
    return this.adminTaskService.createTaskMaterial(body);
  }

  // 更新任务素材
  @Put('material/:id')
  async upTaskMaterial(
    @Param('id') id: string,
    @Body() body: ActionTaskMaterialDto,
  ) {
    const info = await this.adminTaskService.getTaskMaterialById(id);
    if (!info) throw new AppHttpException(ErrHttpBack.fail);

    return this.adminTaskService.upTaskMaterial(id, body);
  }

  // 删除任务素材
  @Delete('material/:id')
  async deleteTaskMaterial(@Param('id') id: string) {
    return this.adminTaskService.deleteTaskMaterial(id);
  }
}

View on GitHub (pinned to d3aa8bea5b)