{"record":{"id":"0802dab5979f7fa2","repo":"AlistGo/alist","slug":"wukong-delete-failed-code-d-message-s","errorCode":null,"errorMessage":"wukong delete failed: code=%d message=%s","messagePattern":"wukong delete failed: code=(.+?) message=(.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/wukong/driver.go","lineNumber":299,"sourceCode":"\n\tvar resp rawResp\n\t_, err := d.client.R().\n\t\tSetContext(ctx).\n\t\tSetQueryParams(map[string]string{\n\t\t\t\"aid\":             d.Aid,\n\t\t\t\"device_platform\": \"web\",\n\t\t\t\"language\":        d.Language,\n\t\t}).\n\t\tSetBody(map[string]any{\n\t\t\t\"file_id_list\": []any{asIDValue(fileID)},\n\t\t}).\n\t\tSetResult(&resp).\n\t\tPost(\"/netdisk/user_file/delete_file\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.Code != 0 {\n\t\treturn fmt.Errorf(\"wukong delete failed: code=%d message=%s\", resp.Code, resp.Message)\n\t}\n\treturn nil\n}\n\nfunc (d *Wukong) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) error {\n\tfatherID := dstDir.GetID()\n\tif fatherID == \"\" {\n\t\tfatherID = d.RootFolderID\n\t}\n\n\ttempFile, err := file.CacheFullInTempFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer tempFile.Close()\n\tif _, err = tempFile.Seek(0, io.SeekStart); err != nil {\n\t\treturn err\n\t}","sourceCodeStart":281,"sourceCodeEnd":317,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/wukong/driver.go#L281-L317","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Treat 'not exist' business codes as success (idempotent delete) by inspecting resp.Code/Message","Refresh the listing before bulk delete so IDs are current","Verify the driver's stored credential still works by calling a cheap read API; re-login if not","Check the file is not owned by another account (shared-in item) before attempting delete"],"exampleFix":"// before\nif err := d.Remove(ctx, obj); err != nil { return err }\n\n// after\nif err := d.Remove(ctx, obj); err != nil {\n    if strings.Contains(err.Error(), \"not exist\") { // map actual upstream code\n        return nil // already gone: idempotent\n    }\n    return err\n}","handlingStrategy":"try-catch","validationCode":"if obj.GetID() == \"\" {\n    return errors.New(\"delete aborted: missing file id\")\n}","typeGuard":null,"tryCatchPattern":"if err := d.Remove(ctx, obj); err != nil {\n    if isWukongCode(err, codeNotExist) {\n        return nil // idempotent: already deleted remotely\n    }\n    return err\n}","preventionTips":["Make bulk deletes idempotent by tolerating 'not exist' codes","Refresh listings before bulk operations so IDs are current","Verify write permission on shared folders before exposing delete in the UI"],"tags":["wukong","delete","api-error","idempotency","cloud-storage","go"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}