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 JetStreamView on GitHub (pinned to 187eb24962)
Solutions
- Check errors.Is(err, errKeyNotFound) and implement miss/fallback logic
- Confirm both writer and reader use the same Configs.Bucket
- Increase bucket MaxAge/TTL if keys expire too early
- 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
- Branch on errors.Is(err, ErrKeyNotFound) before other errors
- Align bucket names via shared config between writer and reader
- Account for TTL: size MaxAge to your data lifetime
- Seed required keys at startup
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.