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
- Verify the NATS server is reachable and the JetStream account is enabled (`nats server info`, `nats stream ls`).
- Check that a stream exists whose subjects cover the topic you publish to; create it via StreamManager/CreateStream if missing.
- Log/unwrap the wrapped cause (errors.Unwrap) to see the specific NATS failure (timeout, no responders, max payload).
- 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
- Provision streams (CreateOrUpdateStream) at startup before any publish.
- Add a readiness check (client health/Query) before accepting traffic.
- Wrap publishes with bounded exponential backoff for transient broker errors.
- Monitor server max_payload vs your message sizes.
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.