gofr-dev/gofr · error

publish error

Error message

publish error

What it means

errPublishError is a sentinel error in gofr's NATS pubsub client (pkg/gofr/datasource/pubsub/nats/errors.go:12). The client returns it when the underlying NATS JetStream Publish or PublishMsgAsync call fails, wrapping the original NATS error. It signals the message was not accepted by the broker (e.g. no stream/subject match, timeouts, or no responders).

Source

Thrown at pkg/gofr/datasource/pubsub/nats/errors.go:12

package nats

import "errors"

var (
	// Client Errors.
	errServerNotProvided       = errors.New("client server address not provided")
	errSubjectsNotProvided     = errors.New("subjects not provided")
	errConsumerNotProvided     = errors.New("consumer name not provided")
	errConsumerCreationError   = errors.New("consumer creation error")
	errFailedToDeleteStream    = errors.New("failed to delete stream")
	errPublishError            = errors.New("publish error")
	errJetStreamNotConfigured  = errors.New("jStream is not configured")
	errJetStreamCreationFailed = errors.New("jStream creation failed")
	errJetStream               = errors.New("jStream error")
	errCreateStream            = errors.New("create stream error")
	errDeleteStream            = errors.New("delete stream error")
	errGetStream               = errors.New("get stream error")
	errCreateOrUpdateStream    = errors.New("create or update stream error")
	errHandlerError            = errors.New("handler error")
	errConnectionError         = errors.New("connection error")
	errSubscriptionError       = errors.New("subscription error")
)

View on GitHub (pinned to 187eb24962)

Solutions

  1. Verify the NATS server is reachable and the JetStream account is enabled (`nats server info`, `nats stream ls`).
  2. Check that a stream exists whose subjects cover the topic you publish to; create it via StreamManager/CreateStream if missing.
  3. Log/unwrap the wrapped cause (errors.Unwrap) to see the specific NATS failure (timeout, no responders, max payload).
  4. Increase client publish timeout or reduce message size to fit nats server max_payload.

Example fix

// before: publishing before the stream exists
client.Publish(ctx, "orders", payload) // fails: subject not bound to any stream
// after: ensure stream covers the subject first
sm := nats.NewStreamManager(js, logger)
_ = sm.CreateOrUpdateStream(ctx, "ORDERS", []string{"orders.*"})
err := client.Publish(ctx, "orders.created", payload)
Defensive patterns

Strategy: retry

Validate before calling

if js == nil || !clientConnected {
    return fmt.Errorf("nats not ready: JetStream handle or connection missing")
}

Try / catch

err := client.Publish(ctx, topic, msg)
if err != nil {
    if errors.Is(err, nats.ErrNoResponders) || errors.Is(err, nats.ErrTimeout) {
        // backoff and retry publish
    }
    return fmt.Errorf("publish to %s failed: %w", topic, err)
}

Prevention

When it happens

Trigger: Calling Client.Publish/PublishWithContext on the NATS client when the JetStream publish call returns an error — broker unreachable, subject not bound to a stream, max payload exceeded, or async publish future returns an error.

Common situations: NATS server down or restarting during deploy; publishing to a subject with no stream configured; message larger than server max_payload; JetStream account limits (memory/storage) exceeded.

Related errors


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