micro/go-micro · error

error while obtaining JetStream context

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.

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.

Appendix: 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)