卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34053本站已运行391

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

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

问题内容

我有一个 SSE 端点,它将数据发送到前端,并且该数据是从另一个 API 端点检索的。我对 go 中的 channels 仍然很陌生,似乎我必须触发 API 端点两次,以便 SSE 端点将数据发送到前端。就目前而言,我还没有编写前端代码来建立 SSE 连接,因为我仍在使用通道。有人可以解释为什么这需要调用 API 两次才能让 SSE 发送数据吗?

上交所路线

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: %snn", <-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

}

向sse发送数据的API

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")
}


正确答案


您看到此情况的原因是您在此部分中使用了 2 条消息

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

每条奇数消息都会发送到 SSE,每条偶数消息都会记录到控制台。应改为

message := <-dataChannel
fmt.Fprintf(w, "data: Message: %snn", message)
log.Println(message)
卓越飞翔博客
上一篇: 如何将golang函数设置为.net aot的回调函数
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏