{"record":{"id":"b4cf2acecb7b2463","repo":"qishibo/AnotherRedisDesktopManager","slug":"e-message-b4cf2a","errorCode":null,"errorMessage":"e.message","messagePattern":"e\\.message","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/components/SlowLog.vue","lineNumber":107,"sourceCode":"        node.callBuffer('SLOWLOG', 'GET', this.scanMax).then((reply) => {\n          for (const item of reply) {\n            const line = {\n              id: item[0],\n              timestring: this.toLocalTime(item[1] * 1000),\n              cost: (item[2] / 1000).toFixed(3),\n              cmd: item[3].join(' '),\n              source: item[4],\n              name: item[5],\n            };\n\n            lines.push(line);\n          }\n\n          this.cmdList = lines;\n          this.isScanning = false;\n        }).catch((e) => {\n          this.isScanning = false;\n          this.$message.error(e.message);\n        });\n      });\n    },\n    initConfig() {\n      this.client.call('CONFIG', 'GET', 'slowlog-log-slower-than').then((reply) => {\n        this.slowerThan = reply[1];\n      }).catch((e) => {});\n      this.client.call('CONFIG', 'GET', 'slowlog-max-len').then((reply) => {\n        this.maxLen = reply[1];\n      }).catch((e) => {});\n    },\n    toLocalTime(timestamp) {\n      const d = new Date(timestamp);\n      const h = `${d.getHours()}`.padStart(2, 0);\n      const m = `${d.getMinutes()}`.padStart(2, 0);\n      const s = `${d.getSeconds()}`.padStart(2, 0);\n\n      const Y = d.getFullYear();","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/qishibo/AnotherRedisDesktopManager/blob/c149855106628babcdfb7675a8e7ba9434d2492a/src/components/SlowLog.vue#L89-L125","documentation":"SlowLog.vue fetches entries with client.call('SLOWLOG', 'GET', ...) and a rejection shows the raw e.message while resetting isScanning. SLOWLOG is NOT in the app's writeCMD list, so readonly mode does not block it - the failure is server-side or transport-level: command disabled by ACL/proxy/managed Redis, or the connection dropped.","triggerScenarios":"ACL user without @admin/@slowlog privileges; managed Redis or a proxy that does not expose SLOWLOG; connection lost while opening the slow-log tab; very restricted whitelisted command set on the server.","commonSituations":"Managed offerings with limited command surfaces; ACL accounts provisioned for the GUI with minimal grants; clicking the slow-log tab right after a network change.","solutions":["Read the exact e.message: 'unknown command' means the server/proxy lacks SLOWLOG; 'NOPERM' means an ACL grant is missing.","Verify directly with redis-cli: 'SLOWLOG GET 10' as the same user.","If the provider blocks SLOWLOG, use the provider's monitoring/logs instead of the tab."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// optional capability probe before opening the tab\nasync function slowlogAvailable(client) {\n  try { await client.call('slowlog', 'len'); return true; }\n  catch { return false; }\n}","typeGuard":"const isCommandRestricted = (e) => /unknown command|NOPERM|not allowed/i.test(e.message);","tryCatchPattern":"this.client.call('SLOWLOG', 'GET', count).then(/* render */).catch((e) => {\n  this.isScanning = false;\n  if (isCommandRestricted(e)) {\n    this.$message.error('SLOWLOG is not available for this connection (ACL/managed Redis)');\n  } else {\n    this.$message.error(e.message);\n  }\n});","preventionTips":["Probe SLOWLOG LEN once and disable the tab when restricted instead of erroring on open.","Grant ACL users +@admin (or +slowlog) if the slow-log tab is needed.","Always reset isScanning in the catch so the UI does not stick in the loading state."],"tags":["slowlog","acl","managed-redis","command-restriction"],"backgroundTag":"redis-command-not-allowed","analyzedSha":"c149855106628babcdfb7675a8e7ba9434d2492a","analyzedAt":"2026-08-22T09:06:28.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}