{"record":{"id":"b642030fb877c06b","repo":"qishibo/AnotherRedisDesktopManager","slug":"this-t-message-modify-failed-b64203","errorCode":null,"errorMessage":"this.$t('message.modify_failed')","messagePattern":"this\\.\\$t\\('message\\.modify_failed'\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/components/contents/KeyContentReJson.vue","lineNumber":62,"sourceCode":"      if (content === false) {\n        return;\n      }\n\n      if (!this.$util.isJson(content)) {\n        return this.$message.error(this.$t('message.json_format_failed'));\n      }\n\n      this.client.call('JSON.SET', [this.redisKey, '$', content]).then((reply) => {\n        if (reply === 'OK') {\n          this.setTTL();\n          this.initShow();\n\n          this.$message.success({\n            message: this.$t('message.modify_success'),\n            duration: 1000,\n          });\n        } else {\n          this.$message.error({\n            message: this.$t('message.modify_failed'),\n            duration: 1000,\n          });\n        }\n      }).catch((e) => {\n        this.$message.error(e.message);\n      });\n    },\n    setTTL() {\n      const ttl = parseInt(this.$parent.$parent.$refs.keyHeader.keyTTL);\n\n      if (ttl > 0) {\n        this.client.expire(this.redisKey, ttl).catch((e) => {\n          this.$message.error(`Expire Error: ${e.message}`);\n        }).then((reply) => {});\n      }\n    },\n    initShortcut() {","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/qishibo/AnotherRedisDesktopManager/blob/c149855106628babcdfb7675a8e7ba9434d2492a/src/components/contents/KeyContentReJson.vue#L44-L80","documentation":"Defensive branch: JSON.SET completed without an exception but the reply was not the literal 'OK' (usually a nil). With the '$' root path and a string value, RedisJSON replies OK on success, so this toast means the set may not have taken effect — most plausibly an old RedisJSON build or an intermediate proxy returning null instead of an error. The displayed text is the translated 'modify_failed' message.","triggerScenarios":"Old RedisJSON module versions or managed services that reply nil for root-path sets; proxies (envoy redis filter, twemproxy) rewriting or dropping replies; RESP2/RESP3 translation bugs between client and server.","commonSituations":"Self-hosted Redis with a year-old RedisJSON SO; unusual network middleboxes in front of Redis; confusion after the toast appears even though the document was actually written.","solutions":["Verify what actually landed: run JSON.GET key '$' and compare with what you saved — the toast can be a false negative","Upgrade the RedisJSON module to a current release if nil replies on success are observed","Remove or inspect any proxy between client and Redis that could mangle replies"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const reply = await client.call('JSON.SET', key, '$', content);\nif (reply !== 'OK') {\n  // verify before declaring failure — some proxies/old modules reply nil on success\n  const stored = await client.call('JSON.GET', key, '$').catch(() => null);\n  if (stored !== content) throw new Error('JSON.SET returned ' + reply);\n}","typeGuard":"const isOkReply = (r) => r === 'OK' || r === null; // null needs read-back confirmation","tryCatchPattern":null,"preventionTips":["Treat a non-OK reply as 'unverified', not 'failed' — confirm with JSON.GET before showing a failure toast","Keep RedisJSON current; very old builds and reply-mangling proxies are the known sources of nil replies","Log the raw reply in bug reports so false negatives can be separated from real write failures"],"tags":["redis","redisjson","json-set","reply-check","vue"],"backgroundTag":"redis-unexpected-reply","analyzedSha":"c149855106628babcdfb7675a8e7ba9434d2492a","analyzedAt":"2026-08-22T09:06:28.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}