{"record":{"id":"3995735210f1e071","repo":"qishibo/AnotherRedisDesktopManager","slug":"e-message-399573","errorCode":null,"errorMessage":"e.message","messagePattern":"e\\.message","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/components/KeyListVirtualTree.vue","lineNumber":237,"sourceCode":"          // del batch instead of single when multi operating\n          if (this.multiOperating) {\n            return this.deleteBatch();\n          }\n\n          const keyBuffer = Buffer.from(this.rightClickNode.data.nameBuffer.data);\n\n          this.client.del(keyBuffer).then((reply) => {\n            if (reply == 1) {\n              this.$message.success({\n                message: this.$t('message.delete_success'),\n                duration: 1000,\n              });\n\n              this.$bus.$emit('refreshKeyList', this.client, keyBuffer, 'del');\n            } else {\n              this.$message.error(this.$t('message.delete_failed'));\n            }\n          }).catch((e) => { this.$message.error(e.message); });\n          break;\n        }\n        // select multiple\n        case 'multiple_select': {\n          this.showMultiSelect();\n          break;\n        }\n        // open key in new tab\n        case 'open': {\n          this.clickKey(Buffer.from(this.rightClickNode.data.nameBuffer.data), true);\n          break;\n        }\n        // delete whole folder\n        case 'delete_folder': {\n          const rule = { pattern: [this.rightClickNode.data.fullName] };\n          this.$bus.$emit('openDelBatch', this.client, this.config.connectionName, rule);\n          break;\n        }","sourceCodeStart":219,"sourceCodeEnd":255,"githubUrl":"https://github.com/qishibo/AnotherRedisDesktopManager/blob/c149855106628babcdfb7675a8e7ba9434d2492a/src/components/KeyListVirtualTree.vue#L219-L255","documentation":"The catch branch when the DEL command itself rejects in KeyListVirtualTree.vue. DEL is in the app's writeCMD table, so on a readonly connection the client-side guard rejects the promise locally; otherwise the rejection is an ACL denial (NOPERM), a lost connection, or another server error.","triggerScenarios":"Deleting a key on a readonly-configured connection (client-side guard fires); ACL user without @write/@keyspace (+del); connection dropped between right-click and confirmation.","commonSituations":"Readonly connection to production; restricted ACL account used for the GUI; network blip during tree operations.","solutions":["If the message is the readonly-mode text, uncheck Readonly in the connection config and reconnect.","If 'NOPERM', grant the ACL user +del (or +@write / +@keyspace).","If connection-related, reconnect and retry the delete."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"import { writeCMD } from '@/commands.js';\nconst delBlocked = client.options.connectionReadOnly && writeCMD['DEL']; // precheck readonly","typeGuard":"const isWriteDenied = (e) => /readonly mode|NOPERM|not allowed/i.test(e.message);","tryCatchPattern":"this.client.del(keyBuffer).catch((e) => {\n  if (isWriteDenied(e)) {\n    this.$message.error('Delete not permitted (readonly connection or ACL) - fix config, retry is pointless');\n  } else {\n    this.$message.error(e.message); // transport error: reconnect and retry\n  }\n});","preventionTips":["Disable delete actions in the UI when client.options.connectionReadOnly is set.","Grant ACL users +del when the GUI must delete keys.","Distinguish permission errors (config fix) from connection errors (reconnect) - the remedies differ."],"tags":["del","readonly","acl","connection-loss"],"backgroundTag":"redis-write-command-denied","analyzedSha":"c149855106628babcdfb7675a8e7ba9434d2492a","analyzedAt":"2026-08-22T09:06:28.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}