gofr-dev/gofr · warning

key not found

Error message

key not found

What it means

In the NATS KV-store client, errKeyNotFound ('key not found') is the sentinel returned by Get and Delete when the key does not exist in the KV bucket. Get wraps it with the key name via %w so errors.Is detection works. It is an expected miss condition, not a client fault.

Source

Thrown at pkg/gofr/datasource/kv-store/nats/nats.go:16

package nats

import (
	"context"
	"errors"
	"fmt"
	"time"

	"github.com/nats-io/nats.go"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/trace"
)

var (
	errStatusDown  = errors.New("status down")
	errKeyNotFound = errors.New("key not found")
)

type Configs struct {
	Server string
	Bucket string
}

type jetStream struct {
	nats.JetStreamContext
}

func (j jetStream) AccountInfo() (*nats.AccountInfo, error) {
	return j.JetStreamContext.AccountInfo()
}

type Client struct {
	conn    *nats.Conn
	js      JetStream

View on GitHub (pinned to 187eb24962)

Solutions

  1. Check errors.Is(err, errKeyNotFound) and implement miss/fallback logic
  2. Confirm both writer and reader use the same Configs.Bucket
  3. Increase bucket MaxAge/TTL if keys expire too early
  4. Put the key first or seed required keys at startup

Example fix

// before
v, err := kv.Get(ctx, "cfg:app")
if err != nil { panic(err) }
// after
v, err := kv.Get(ctx, "cfg:app")
if errors.Is(err, natskv.ErrKeyNotFound) { v = defaultCfg } else if err != nil { return err }
Defensive patterns

Strategy: fallback

Validate before calling

// verify bucket consistency before reads
if readerBucket != writerBucket { return fmt.Errorf("bucket mismatch: %q vs %q", readerBucket, writerBucket) }

Type guard

func IsKeyNotFound(err error) bool { return errors.Is(err, natskv.ErrKeyNotFound) }

Try / catch

v, err := store.Get(ctx, key)
switch {
case errors.Is(err, natskv.ErrKeyNotFound): v = defaultValue
case err != nil: return err
}

Prevention

When it happens

Trigger: Client.Get(ctx, key) for a key never Put into the bucket, keys expired via bucket TTL (MaxAge), keys from a different bucket, or Delete on a non-existent key.

Common situations: Reading before first write, TTL-expired session data, bucket name mismatch between writer and reader, keys purged by KV history limits.

Related errors


AI-assisted analysis of gofr-dev/gofr@187eb24962 (2026-09-01). Data as JSON: /api/errors/1bed0eae9a6230ec. Report an issue: GitHub.