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

  1. Connect directly to a real Redis node instead of through the proxy.
  2. If an ACL is in play, grant the user the @keyspace category (SCAN) - 'ACL SETUSER myuser +@keyspace'.
  3. 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.
  4. 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

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.