micro/go-micro · error

error while obtaining JetStream context: %w

Error message

error while obtaining JetStream context: %w

What it means

This error occurs when the NATS connection succeeded but conn.JetStream() failed to obtain a JetStream context. The connection is closed before returning to avoid leaking sockets. It almost always means JetStream is disabled or unavailable on the connected server.

Source

Thrown at events/natsjs/nats.go:89

	if options.Name != "" {
		nopts.Name = options.Name
	}

	if options.Username != "" && options.Password != "" {
		nopts.User = options.Username
		nopts.Password = options.Password
	}

	conn, err := nopts.Connect()
	if err != nil {
		tls := nopts.TLSConfig != nil
		return nil, nil, fmt.Errorf("error connecting to nats at %v with tls enabled (%v): %w", options.Address, tls, err)
	}

	js, err := conn.JetStream()
	if err != nil {
		conn.Close() // Close connection if JetStream context fails
		return nil, nil, fmt.Errorf("error while obtaining JetStream context: %w", err)
	}

	return conn, js, nil
}

// Publish a message to a topic.
func (s *stream) Publish(topic string, msg interface{}, opts ...events.PublishOption) error {
	// validate the topic
	if len(topic) == 0 {
		return events.ErrMissingTopic
	}

	// parse the options
	options := events.PublishOptions{
		Timestamp: time.Now(),
	}
	for _, o := range opts {
		o(&options)

View on GitHub (pinned to 24529f1404)

Solutions

  1. Enable JetStream on the server: nats-server -js or set enable_jetstream: true in the config, then restart.
  2. Upgrade the NATS server to >= 2.2 if it is older.
  3. Verify with nats --server=<address> account info that JetStream is enabled for your account.
  4. Check server logs for JetStream startup errors (e.g. storage directory not writable).
  5. Retry NewStream after the server is corrected; the connection was already closed for you.

Example fix

// before (server config)
// nats-server -p 4222
// after
// nats-server -p 4222 -js --store_dir /data/jetstream
Defensive patterns

Strategy: fallback

Validate before calling

nc, err := nats.Connect(addr)
if err == nil {
	info := nc.ConnectedServerInfo()
	if !info.JetStream { return errors.New("server has JetStream disabled") }
	nc.Close()
}

Type guard

func isJetStreamDisabled(err error) bool { return strings.Contains(err.Error(), "JetStream context") }

Try / catch

conn, js, err := connectToNatsJetStream(opts)
if err != nil {
	if strings.Contains(err.Error(), "JetStream context") {
		log.Fatal("enable JetStream on the NATS server (-js) before starting")
	}
	return err
}

Prevention

When it happens

Trigger: Calling events/natsjs.NewStream against a NATS server started without JetStream enabled, or a server too old to support JetStream, or a leaf/super-cluster route where JetStream is not enabled for the account.

Common situations: Running stock NATS server without -js flag or enable_jetstream: true in config; connecting to an old NATS server version (<2.2); connecting to a monitoring-only node in a cluster that has no JetStream assets enabled for the account.

Related errors


AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01). Data as JSON: /api/errors/8ae9217cd6aeecba. Report an issue: GitHub.