qishibo/AnotherRedisDesktopManager · error

e.message

Error message

e.message

What it means

Toast fed by the 'error' event of the ioredis SSCAN stream (sscanBufferStream) in KeyContentSet.vue:177. Identical failure class to the hash scanner: a cursor round-trip failed. ioredis scan streams emit 'error' on connection loss mid-iteration, READONLY/WONGTYPE replies (key no longer a set), or cluster redirection storms. The component stops pagination (loadMoreDisable = true) and clears the loading icon.

Source

Thrown at src/components/contents/KeyContentSet.vue:177

        this.oneTimeListLength += setData.length;
        this.setData = this.setData.concat(setData);

        if (this.oneTimeListLength >= this.pageSize) {
          this.scanStream.pause();
          this.loadingIcon = '';
        }
      });

      this.scanStream.on('end', () => {
        this.loadingIcon = '';
        this.loadMoreDisable = true;
      });

      this.scanStream.on('error', (e) => {
        this.loadingIcon = '';
        this.loadMoreDisable = true;
        this.$message.error(e.message);
      });
    },
    getScanMatch() {
      return this.filterValue ? `*${this.filterValue}*` : '*';
    },
    openDialog() {
      this.$nextTick(() => {
        this.$refs.formatViewer.autoFormat();
      });
    },
    showEditDialog(row) {
      this.editLineItem = this.$util.cloneObjWithBuff(row);
      this.beforeEditItem = row;
      this.editDialog = true;
    },
    dumpCommand(item) {
      const lines = item ? [item] : this.setData;
      const params = lines.map(line => this.$util.bufToQuotation(line.value));

View on GitHub (pinned to c149855106)

Solutions

  1. Reconnect and press load-more again — SCAN starts a fresh cursor, no server state is harmed
  2. Confirm the key type still reads 'set'; if not, reload the key
  3. Use the member filter to shrink the result space before paging big sets
  4. Stabilize the transport (tunnel keepalive, larger timeouts) for very large keys

Example fix

// before
this.scanStream.on('error', (e) => {
  this.loadingIcon = '';
  this.loadMoreDisable = true;
  this.$message.error(e.message);
});

// after: only permanently disable pagination on data-shape errors
this.scanStream.on('error', (e) => {
  this.loadingIcon = '';
  this.loadMoreDisable = /WRONGTYPE|READONLY/.test(e.message);
  this.scanStream = null; // rebuild stream on next loadMore
  this.$message.error(e.message);
});
Defensive patterns

Strategy: try-catch

Validate before calling

if (this.client.status !== 'ready') {
  this.$message.error(`connection not ready (${this.client.status})`);
  return;
}

Try / catch

this.scanStream.on('error', (e) => {
  this.loadingIcon = '';
  this.scanStream = null;
  this.loadMoreDisable = /WRONGTYPE/.test(e.message);
  this.$message.error(e.message);
});

Prevention

When it happens

Trigger: sscanBufferStream errors when: the socket dies between cursor pages; the key is replaced with a non-set type so SSCAN replies WRONGTYPE; a replica rejects the read during failover; the SSH tunnel or sentinel connection resets during a long scan of a large set.

Common situations: Browsing a million-member set over a VPN that drops mid-pagination; containerized Redis restarted while the GUI paged; key schema swapped (set -> stream) by a deploy during inspection.

Related errors


AI-assisted analysis of qishibo/AnotherRedisDesktopManager@c149855106 (2026-08-22). Data as JSON: /api/errors/b1814d1b3f683c78. Report an issue: GitHub.