qishibo/AnotherRedisDesktopManager · warning
this.$t('message.scan_disabled')
Error message
this.$t('message.scan_disabled') What it means
Special-cased SCAN failure in KeyList.vue's stream error handler. When the server/proxy error message contains 'unknown command' together with 'scan', or exactly matches "command 'SCAN' is not allowed" (the signature of restrictive proxies and ACL-restricted users), the app shows the localized 'scan_disabled' toast and deliberately keeps the connection usable - per the comment, other functions still work.
Source
Thrown at src/components/KeyList.vue:188
this.onePageKeysCount += keys.length;
// scan once reaches page size
if (this.onePageKeysCount >= keysPageSize && loadAll === false) {
// temp stop
stream.pause();
this.resetSearchStatus();
}
});
stream.on('error', (e) => {
this.resetSearchStatus();
// scan command disabled, other functions may be used normally
if (
(e.message.includes('unknown command') && e.message.includes('scan'))
|| e.message.includes("command 'SCAN' is not allowed")
) {
return this.$message.error({
message: this.$t('message.scan_disabled'),
duration: 1500,
});
}
// other errors
this.$message.error({
message: `Stream On Error: ${e.message}`,
duration: 1500,
});
setTimeout(() => {
this.$bus.$emit('closeConnection');
}, 50);
});
stream.on('end', () => {
// all nodes scan finished(cusor back to 0)View on GitHub (pinned to c149855106)
Solutions
- Connect directly to a real Redis node instead of through the proxy.
- If an ACL is in play, grant the user the @keyspace category (SCAN) - 'ACL SETUSER myuser +@keyspace'.
- For read-only exploration without SCAN, use exact key-name lookup (the app's exists-based exact match) or KEYS on small, non-production instances.
- Upgrade servers older than Redis 2.8.
Defensive patterns
Strategy: fallback
Validate before calling
// probe SCAN availability once per connection
async function scanAvailable(client) {
try {
await client.call('scan', '0');
return true;
} catch (e) {
return !(e.message.includes('unknown command') || e.message.includes('is not allowed'));
}
} Type guard
const isScanDisabledError = (e) =>
(e.message.includes('unknown command') && e.message.includes('scan')) ||
e.message.includes("command 'SCAN' is not allowed"); Try / catch
stream.on('error', (e) => {
if (isScanDisabledError(e)) {
switchToExactMatchMode(); // degraded but functional - do NOT close the connection
} else {
handleFatalStreamError(e);
}
}); Prevention
- Probe SCAN once per connection and cache the result instead of discovering the restriction mid-scan.
- When SCAN is unavailable, fall back to exact-name lookups (EXISTS) rather than erroring.
- Prefer direct node connections over proxies that implement a subset of the command set.
When it happens
Trigger: Connecting through a proxy that does not implement SCAN (Twemproxy, some managed front-ends); Redis 2.x older than SCAN's introduction in 2.8; an ACL user restricted with '-scan' or missing the @keyspace category; managed offerings that whitelist a fixed command set.
Common situations: Corporate proxy in front of Redis; ElastiCache/managed entry points with limited command surfaces; tightly scoped ACL users created for the GUI.
Related errors
AI-assisted analysis of qishibo/AnotherRedisDesktopManager@c149855106 (2026-08-22).
Data as JSON: /api/errors/9e37ce20678cbbc1.
Report an issue: GitHub.