{"id":"2555eb3023c151a7","repo":"gofiber/fiber","slug":"sse-marshal-data-w","errorCode":null,"errorMessage":"sse: marshal data: %w","messagePattern":"sse: marshal data: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"middleware/sse/event.go","lineNumber":109,"sourceCode":"type eventPayload struct {\n\tdata    string\n\thasData bool\n}\n\nfunc eventData(data any, jsonMarshal utils.JSONMarshal) (eventPayload, error) {\n\tswitch value := data.(type) {\n\tcase nil:\n\t\treturn eventPayload{}, nil\n\tcase string:\n\t\treturn eventPayload{data: value, hasData: true}, nil\n\tcase []byte:\n\t\treturn eventPayload{data: string(value), hasData: true}, nil\n\tcase json.RawMessage:\n\t\treturn eventPayload{data: string(value), hasData: true}, nil\n\tdefault:\n\t\tencoded, err := jsonMarshal(value)\n\t\tif err != nil {\n\t\t\treturn eventPayload{}, fmt.Errorf(\"sse: marshal data: %w\", err)\n\t\t}\n\t\treturn eventPayload{data: string(encoded), hasData: true}, nil\n\t}\n}\n\nfunc jsonMarshalOrDefault(jsonMarshal []utils.JSONMarshal) utils.JSONMarshal {\n\tif len(jsonMarshal) > 0 && jsonMarshal[0] != nil {\n\t\treturn jsonMarshal[0]\n\t}\n\treturn json.Marshal\n}\n\nfunc appendField(w *bytes.Buffer, field, value string) {\n\tw.WriteString(field) //nolint:errcheck // bytes.Buffer writes never fail.\n\tw.WriteString(\": \")  //nolint:errcheck // bytes.Buffer writes never fail.\n\tw.WriteString(value) //nolint:errcheck // bytes.Buffer writes never fail.\n\tw.WriteByte('\\n')    //nolint:errcheck // bytes.Buffer writes never fail.\n}","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/gofiber/fiber/blob/9a4c7e57fe0b080a04235d28a4b0d2b4b353d58c/middleware/sse/event.go#L91-L127","documentation":"When Event.Data is not nil/string/[]byte/json.RawMessage, Fiber JSON-encodes it (via json.Marshal or a custom JSONMarshal). This error means the value cannot be marshaled to JSON: it contains a channel, func, complex number, a custom MarshalJSON that returns an error, or a cyclic structure.","triggerScenarios":"Passing sse.Event{Data: make(chan int)}, a struct with a func field, a value whose MarshalJSON errors, or a custom JSONEncoder that fails; or an unmarshalable nested field.","commonSituations":"Accidentally putting a non-serializable Go value as event data; custom MarshalJSON that errors on edge states; a buggy custom JSONEncoder set on the app.","solutions":["Only pass JSON-serializable values as Event.Data, or pass raw bytes/json.RawMessage for full control.","Pre-marshal the value yourself and pass []byte to bypass Fiber's marshal step.","Fix any custom MarshalJSON or app.Config.JSONEncoder that returns errors."],"exampleFix":"// before\nstream.Event(sse.Event{Data: job}) // job contains a chan/func or bad MarshalJSON\n\n// after\nraw, err := json.Marshal(job)\nif err != nil { return err }\nstream.Event(sse.Event{Data: json.RawMessage(raw)})","handlingStrategy":"validation","validationCode":"// pre-marshal so errors surface before you touch the stream\nraw, err := json.Marshal(payload)\nif err != nil {\n    return fmt.Errorf(\"event payload not serializable: %w\", err)\n}\nevent.Data = json.RawMessage(raw)","typeGuard":"// typeGuard: reject known-unserializable kinds before sending.\nfunc jsonSerializable(v any) bool {\n    if v == nil { return true }\n    switch reflect.TypeOf(v).Kind() {\n    case reflect.Chan, reflect.Func, reflect.UnsafePointer,\n         reflect.Complex64, reflect.Complex128:\n        return false\n    }\n    return true\n}","tryCatchPattern":"if err := stream.Event(ev); err != nil {\n    if strings.Contains(err.Error(), \"sse: marshal data\") {\n        raw, mErr := json.Marshal(ev.Data)\n        if mErr != nil { return mErr }\n        ev.Data = json.RawMessage(raw)\n        return stream.Event(ev)\n    }\n}","preventionTips":["Never put chan/func/complex values in Event.Data.","Pre-marshal to []byte/json.RawMessage when unsure.","Unit-test JSON marshaling of payload types."],"tags":["sse","json","serialization","fiber"],"analyzedSha":"9a4c7e57fe0b080a04235d28a4b0d2b4b353d58c","analyzedAt":"2026-08-04T21:44:03.395Z","schemaVersion":2}