{"record":{"id":"2f317253f1d9cd77","repo":"qishibo/AnotherRedisDesktopManager","slug":"key-this-t-message-key-not-exists","errorCode":null,"errorMessage":"${key} ${this.$t('message.key_not_exists')}","messagePattern":"\\$\\{key\\} \\$\\{this\\.\\$t\\('message\\.key_not_exists'\\)\\}","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/components/Tabs.vue","lineNumber":201,"sourceCode":"\n      this.addTab(newTabItem, true);\n    },\n    addSlowLogTab(client, tabName) {\n      const newTabItem = {\n        name: `slowlog_${tabName}_${Math.random()}`,\n        label: this.$util.cutString(tabName),\n        title: tabName,\n        client,\n        component: 'slowlog',\n      };\n\n      this.addTab(newTabItem, true);\n    },\n    addKeyTab(client, key, newTab = false) {\n      client.type(key).then((type) => {\n        // key not exists\n        if (type === 'none') {\n          this.$message.error({\n            message: `${key} ${this.$t('message.key_not_exists')}`,\n            duration: 1000,\n          });\n\n          return;\n        }\n\n        this.addTab(this.initKeyTabItem(client, key, type), newTab);\n      }).catch((e) => {\n        this.$message.error(`Type Error: ${e.message}`);\n      });\n    },\n    initKeyTabItem(client, key, type) {\n      const { cutString } = this.$util;\n      const dbIndex = client.condition ? client.condition.select : 0;\n      const { connectionName } = client.options;\n      const keyStr = this.$util.bufToString(key);\n","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/qishibo/AnotherRedisDesktopManager/blob/c149855106628babcdfb7675a8e7ba9434d2492a/src/components/Tabs.vue#L183-L219","documentation":"client.type(key) resolved with the string 'none' — Redis returns TYPE none for a key that does not exist. This is not a command failure: the key expired, was deleted by another client, or the page references a key from a different DB. The app blocks opening the tab and shows '<key> does not exist' for one second.","triggerScenarios":"Clicking a stale row in the key list whose TTL expired between scan and click; another operator or CLI deleting the key first; the key list cached from a different DB or connection; refresh races right after batch deletes.","commonSituations":"Short-TTL session/lock keys, multi-operator cleanups, stale key lists after switching DBs, old bookmarks or reopened tabs pointing at removed keys.","solutions":["Refresh the key list (the row disappears) and retry with an existing key","Confirm the correct DB/connection is selected","Check TTL on volatile keys before relying on their presence","Treat 'none' as expected drift in shared environments, not an error"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const exists = await client.exists(key);\nif (!exists) {\n  this.$message.error(`${key} ${this.$t('message.key_not_exists')}`);\n  return;\n}","typeGuard":"const isExistingKeyType = (type) => typeof type === 'string' && type !== 'none';","tryCatchPattern":null,"preventionTips":["Expect TYPE 'none' for missing keys and handle it before opening tabs","Refresh lists before acting on volatile keys","Surface TTL in the UI for short-lived keys","Auto-prune list rows that fail an exists check"],"tags":["redis","type","missing-key","ttl-expiry","stale-list"],"backgroundTag":"redis-key-not-found","analyzedSha":"c149855106628babcdfb7675a8e7ba9434d2492a","analyzedAt":"2026-08-22T09:06:28.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}