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
- Enable JetStream on the server: nats-server -js or set enable_jetstream: true in the config, then restart.
- Upgrade the NATS server to >= 2.2 if it is older.
- Verify with nats --server=<address> account info that JetStream is enabled for your account.
- Check server logs for JetStream startup errors (e.g. storage directory not writable).
- 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
- Start all NATS servers with -js / enable_jetstream: true by default.
- Pin NATS server >= 2.2 in deployment manifests.
- Add a startup probe that checks JetStream availability for the account.
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
- source not found: %s
- error connecting to nats cluster %v: %w
- Stream did not exist and adding a stream failed
- Error subscribing to topic
- Failed to connect to NATS Server
AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01).
Data as JSON: /api/errors/8ae9217cd6aeecba.
Report an issue: GitHub.