AlistGo/alist · error

wukong delete failed: code=%d message=%s

Error message

wukong delete failed: code=%d message=%s

What it means

Thrown by the Wukong driver's Remove after POSTing file_id_list to /netdisk/user_file/delete_file. The API accepted the HTTP request but returned a non-zero business code: the delete was refused. Usually the file_id is unknown (already deleted), the session is expired, or the account lacks delete permission.

Source

Thrown at drivers/wukong/driver.go:299

	var resp rawResp
	_, err := d.client.R().
		SetContext(ctx).
		SetQueryParams(map[string]string{
			"aid":             d.Aid,
			"device_platform": "web",
			"language":        d.Language,
		}).
		SetBody(map[string]any{
			"file_id_list": []any{asIDValue(fileID)},
		}).
		SetResult(&resp).
		Post("/netdisk/user_file/delete_file")
	if err != nil {
		return err
	}
	if resp.Code != 0 {
		return fmt.Errorf("wukong delete failed: code=%d message=%s", resp.Code, resp.Message)
	}
	return nil
}

func (d *Wukong) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) error {
	fatherID := dstDir.GetID()
	if fatherID == "" {
		fatherID = d.RootFolderID
	}

	tempFile, err := file.CacheFullInTempFile()
	if err != nil {
		return err
	}
	defer tempFile.Close()
	if _, err = tempFile.Seek(0, io.SeekStart); err != nil {
		return err
	}

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Treat 'not exist' business codes as success (idempotent delete) by inspecting resp.Code/Message
  2. Refresh the listing before bulk delete so IDs are current
  3. Verify the driver's stored credential still works by calling a cheap read API; re-login if not
  4. Check the file is not owned by another account (shared-in item) before attempting delete

Example fix

// before
if err := d.Remove(ctx, obj); err != nil { return err }

// after
if err := d.Remove(ctx, obj); err != nil {
    if strings.Contains(err.Error(), "not exist") { // map actual upstream code
        return nil // already gone: idempotent
    }
    return err
}
Defensive patterns

Strategy: try-catch

Validate before calling

if obj.GetID() == "" {
    return errors.New("delete aborted: missing file id")
}

Try / catch

if err := d.Remove(ctx, obj); err != nil {
    if isWukongCode(err, codeNotExist) {
        return nil // idempotent: already deleted remotely
    }
    return err
}

Prevention

When it happens

Trigger: Deleting an object whose ID is stale because it was already removed in the Wukong web UI; deleting another user's shared file; deleting during an active upload/transfer of the same file; session cookie invalidated.

Common situations: Batch deletions from a cached listing where some entries vanished remotely; multi-tab usage where the web pan and the driver race; read-only shared folders mounted as writable.

Related errors


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/0802dab5979f7fa2. Report an issue: GitHub.