{"record":{"id":"ca0b3cd532fe8a8c","repo":"qishibo/AnotherRedisDesktopManager","slug":"e-message-ca0b3c","errorCode":null,"errorMessage":"e.message","messagePattern":"e\\.message","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/components/contents/KeyContentList.vue","lineNumber":166,"sourceCode":"\n        this.oneTimeListLength += listData.length;\n        this.listData = this.listData.concat(listData);\n\n        if (this.oneTimeListLength >= this.pageSize) {\n          this.loadingIcon = '';\n          this.oneTimeListLength = 0;\n          return;\n        }\n\n        if (this.cancelScanning) {\n          return;\n        }\n        // continue scanning until to pagesize\n        this.loadMore();\n      }).catch((e) => {\n        this.loadingIcon = '';\n        this.loadMoreDisable = true;\n        this.$message.error(e.message);\n      });\n    },\n    initTotal() {\n      this.client.llen(this.redisKey).then((reply) => {\n        this.total = reply;\n      }).catch((e) => {});\n    },\n    resetTable() {\n      this.listData = [];\n      this.pageIndex = 0;\n      this.oneTimeListLength = 0;\n      this.loadMoreDisable = false;\n    },\n    loadMore() {\n      this.pageIndex++;\n      this.listScan();\n    },\n    openDialog() {","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/qishibo/AnotherRedisDesktopManager/blob/c149855106628babcdfb7675a8e7ba9434d2492a/src/components/contents/KeyContentList.vue#L148-L184","documentation":"Catch handler for the paged list scan in KeyContentList.vue's loadMore(). The component progressively LRANGEs the list key to fill the table; if any command in that chain (or in the continuation this.loadMore() triggers) rejects, the spinner is cleared (loadingIcon = ''), further paging is disabled (loadMoreDisable = true), and the raw error message is toasted. This is a transport/command failure, not a data validation issue.","triggerScenarios":"LRANGE redisKey start stop rejecting: the key was deleted or expired between page loads (reply becomes empty rather than error, but WRONGTYPE fires if the key was recreated as another type); the connection was closed/idle-killed mid-scan (Error: Connection is closed); ACL user lacks read permission on the key; server OOM/maxmemory eviction while paging a long list.","commonSituations":"Scrolling a long list in a GUI while another client FLUSHes or DELs the key; laptop sleep/resume dropping a keepalive-less TCP connection to remote Redis; Redis restart during browsing; proxy/LB idle timeout (e.g. 60s) killing the socket between page fetches; large-list paging putting the link under load.","solutions":["If the message is connection-related: re-open/re-select the connection so the client reconnects, then click reload on the key tab","If the key was deleted/recreated as another type: refresh the key list — WRONGTYPE means the name now holds a non-list value; open it with the matching viewer","Check ACLs with ACL LIST / ACL GETUSER if a 'permission denied'-style message appears for this key only","For long idle sessions, lower the keepalive/ping interval or reconnect before deep-paging very long lists"],"exampleFix":"// before: any scan error permanently disables paging until manual reset\n}).catch((e) => {\n  this.loadingIcon = '';\n  this.loadMoreDisable = true;\n  this.$message.error(e.message);\n});\n\n// after: connection errors stay retryable instead of disabling the pager\n}).catch((e) => {\n  this.loadingIcon = '';\n  const fatal = /WRONGTYPE|no such key/i.test(e.message);\n  this.loadMoreDisable = fatal;\n  this.$message.error(e.message);\n});","handlingStrategy":"try-catch","validationCode":"// before deep paging, verify the key is still a live list\nconst type = await client.type(this.redisKey);\nif (type !== 'list') { this.resetTable(); return; }","typeGuard":"null","tryCatchPattern":"// classify scan failures: transient link errors stay retryable, data errors resync\ntry {\n  await this.loadMore();\n} catch (e) {\n  this.loadingIcon = '';\n  const msg = String(e.message || e);\n  if (/closed|ECONNRESET|timeout/i.test(msg)) {\n    this.$message.warning('Connection lost — retry after reconnect');\n    // keep loadMoreDisable = false so paging can resume\n  } else {\n    this.loadMoreDisable = true;   // WRONGTYPE / permissions: refresh needed\n    this.$message.error(msg);\n  }\n}","preventionTips":["Re-check TYPE/EXISTS before each page fetch on long lists instead of assuming the key is stable","Use .finally to clear loadingIcon so a rejection can never strand the spinner","Enable TCP keepalive / periodic PING on long browsing sessions against remote or managed Redis","Disable the pager only for data-model errors (WRONGTYPE, ACL); connection errors should allow retry"],"tags":["redis","list","lrange","pagination","promise-catch","connection-drop","vue"],"backgroundTag":"redis-command-error","analyzedSha":"c149855106628babcdfb7675a8e7ba9434d2492a","analyzedAt":"2026-08-22T09:06:28.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}