Heim  >  Artikel  >  Backend-Entwicklung  >  Der Kanal sendet bei der ersten API-Anfrage keine Daten

Der Kanal sendet bei der ersten API-Anfrage keine Daten

WBOY
WBOYnach vorne
2024-02-05 22:06:04675Durchsuche

通道未在第一个 API 请求上发送数据

Frageninhalt

Ich habe ein SSE 端点,它将数据发送到前端,并且该数据是从另一个 API 端点检索的。我对 go 中的 channels, das noch neu ist, und es scheint, als müsste ich den API-Endpunkt zweimal auslösen, damit der SSE-Endpunkt Daten an das Frontend senden kann. Im Moment habe ich den Front-End-Code zum Herstellen einer SSE-Verbindung noch nicht geschrieben, da ich immer noch Kanäle verwende. Kann jemand erklären, warum hierfür ein zweimaliger Aufruf der API erforderlich ist, damit SSE die Daten sendet?

Shanghai Stock Exchange Route

func SendSSE(appCtx *fiber.Ctx, dataChannel chan string) error {
    appCtx.Set("Content-Type", "text/event-stream")
    appCtx.Set("Cache-Control", "no-cache")
    appCtx.Set("Connection", "keep-alive")
    appCtx.Set("Transfer-Encoding", "chunked")

    appCtx.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
        log.Println("SSE Opened")
        for {
            log.Println("Retrieving data channel..")
            fmt.Fprintf(w, "data: Message: %s\n\n", <-dataChannel)
            log.Println(<-dataChannel)

            err := w.Flush()
            if err != nil {
                // Refreshing page in web browser will establish a new
                // SSE connection, but only (the last) one is alive, so
                // dead connections must be closed here.
                fmt.Printf("Error while flushing: %v. Closing http connection.\n", err)

                break
            }

        }
    }))

    fmt.Println("SSE Closed")
    return nil

}

API zum Senden von Daten an sse

func GetApiData(appCtx *fiber.Ctx, dataChannel chan string) error {
    log.Println("Sending DataChannel data")
    dataChannel <- "Data is passed from api to sse"
    return appCtx.Status(http.StatusOK).SendString("Not Implemented")
}


Richtige Antwort


Der Grund, warum Sie das sehen, ist, dass Sie in diesem Abschnitt zwei Nachrichten verwendet haben

fmt.Fprintf(w, "data: Message: %s\n\n", <-dataChannel)
log.Println(<-dataChannel)

Jede ungerade Nachricht wird an SSE gesendet und jede gerade Nachricht wird in der Konsole protokolliert. Sollte in

geändert werden
message := <-dataChannel
fmt.Fprintf(w, "data: Message: %s\n\n", message)
log.Println(message)

Das obige ist der detaillierte Inhalt vonDer Kanal sendet bei der ersten API-Anfrage keine Daten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen