Go语言 从服务器发送的事件生成HTML表

83qze16e  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(133)

我需要一个不断更新的前端HTML表,从后端获取它的数据。下面是我的golang后端生成一个随机数,将其放入一个结构体中,然后将该结构体追加到一个结构体切片中,并使用Server Sent Events将其带到前端:
这样做的结果应该是一堆结构的一个长切片。我希望这是在前端,其中结构体的切片是整个表,切片中的每个结构体是HTML表中的一行。

type sliceofRand struct {
    Items []randomData
}

var sliceofRandvar sliceofRand

func formatServerSentEvent(event string, data any) (string, error) {
    m := map[string]any{
        "data": data,
    }

    buff := bytes.NewBuffer([]byte{})

    encoder := json.NewEncoder(buff)

    err := encoder.Encode(m)
    if err != nil {
        return "", err
    }

    sb := strings.Builder{}

    sb.WriteString(fmt.Sprintf("event: %s\n", event))
    sb.WriteString(fmt.Sprintf("data: %v\n\n", buff.String()))

    return sb.String(), nil
}

func SseHandler(w http.ResponseWriter, r *http.Request) {

    flusher, ok := w.(http.Flusher)
    if !ok {
        http.Error(w, "SSE not supported", http.StatusInternalServerError)
        return
    }

    fmt.Println("Request received for price...")

    w.Header().Set("Content-Type", "text/event-stream")

    priceCh := make(chan sliceofRand)

    go func() {
        for {
            number := rand.Intn(100)
            view := randomData{
                Number: number,
                Info: "Random number",
            }

            sliceofRandvar.Items = append(sliceofRandvar.Items, view)

            priceCh <- sliceofRandvar
            time.Sleep(3 * time.Second)
        }
    }()

    for price := range priceCh {
        event, err := formatServerSentEvent("price-update", price)
        if err != nil {
            fmt.Println(err)
            break
        }

        _, err = fmt.Fprint(w, event)
        if err != nil {
            fmt.Println(err)
            break
        }

        flusher.Flush()
    }

}

正如你所看到的,我有一个函数,它将数据作为服务器发送事件发送到前端,每次我在一个单独的goroutine中生成一个新的随机数时,我都会将新的结构体追加到一个结构体列表中,并调用SSE函数并创建一个新的SSE。现在我的问题是,我在前端得到这个,我想把所有东西都放进一个HTML表。
以下是我在前端看到的SSE输出:

{"data":{"Items":[{"Random_Number":14,"Something":"this_is_something"},
{"Random_Number":88,"Something":"this_is_something"}]}}
hgqdbh6s

hgqdbh6s1#

我不知道你在前端使用什么;它是一个框架还是一个简单的HTML模板?
让我们假设你有一个简单的html表:<table> <tbody id="rows"></tbody></table>
你可以在获取数据的JavaScript脚本函数中像这样使用JQuery:

var obj; //parsed from server event
/* obj = {"data":{"Items":[{"Random_Number":14,"Something":"this_is_something"},
{"Random_Number":88,"Something":"this_is_something"}]}}*/

$("#rows").empty();
obj.data.Items.forEach((element) => {

$("#rows").append("<tr><td>"+element.Random_Number+" </td><td>"+element.Something+" </td></tr>");

});

相关问题