javascript - 是什么导致 eventSource 停留在 readyState 0?

标签 javascript azure go revel

我在 azure 上有一个 go 应用程序,它根据在 url 中作为事件源“.co/stream/{id}”发送的 id 生成 SSE 连接。 其中一个 ID 的使用频率高于其他 ID,并且已停止连接,但任何其他 ID 都可以正常连接。该应用程序位于 ubuntu 虚拟机中。

客户端与 vue 应用程序连接。

我不确定 azure 是否阻止了 url 或者连接是否有限制?

我尝试过的事情:

端点和端口已在 Azure 的网络配置中配置。 重新启动应用程序和服务器工作几分钟(5-10 分钟),但随后在客户端上收到 Err_Connection_Refused。 虚拟机上的 CPU 和内存使用率非常低

客户

var url = "example.co:3000/";
var streaming = "stream/";

var source = new EventSource(url + streaming + this.$route.params.idCine);

console.log("ready state connecting = " + source.readyState);

source.onmessage = function(event) {
   console.log("ready state = " + source.readyState);
   console.log('yay');
}

后端连接到 mysql 数据库并为客户端消息生成 json


package controllers

import (

    "github.com/revel/revel"
    "cplsAPI/app"
    "time"
    "fmt"
    "strconv"
)

type App struct {
    *revel.Controller
}
type Order struct {
    IdOrder int` json:"idOrder" `
    OrderNum string` json:"orderNum" `
    CustomerName string` json:"customerName" `
    DeliveryPoint int` json:"deliveryPoint" `
    ImageUrl string` json:"imageUrl" `
    Timer int` json:"timer" `
    Status int` json:"status" `
    IdCine int` json:"idCine" `
}
func (c App) Index() revel.Result {
    return c.Render()
}

func (c App) GetOrders() revel.Result {
    idCine := c.Params.Route.Get("idCine")
    sql := "SELECT * FROM Orders WHERE idCine = "+idCine+";"
    rows, err := app.DB.Query(sql)
    var resul []Order

    checkErr(err)
    for rows.Next() {
            var idOrder int
            var orderNum string
            var customerName string
            var deliveryPoint int
            var imageUrl string
            var timer int
            var status int
            var idCine int
            var createdAt string
            var updatedAt string
            err = rows.Scan(&idOrder,&orderNum,&customerName,&deliveryPoint,&imageUrl,&timer,&status,&idCine,&createdAt,&updatedAt)
            checkErr(err)
            resul = append(resul, Order{IdOrder:idOrder , OrderNum:orderNum , CustomerName:customerName , DeliveryPoint:deliveryPoint , ImageUrl:imageUrl , Timer:timer , Status:status , IdCine:idCine})
    // fmt.Printf("%+v\n", resul)
    }
    defer rows.Close()
    return c.RenderJSON(resul)

}

func (c App) NewOrder() revel.Result {
    idCine := c.Params.Route.Get("idCine")
    var jsonData  Order
    c.Params.BindJSON(&jsonData)
    // fmt.Printf("%+v",jsonData)

    // fmt.Printf("\n")
    // fmt.Printf(jsonData.OrderNum)
    // fmt.Printf("\n")

    sql:= fmt.Sprintf("INSERT Orders (orderNum, customerName, deliveryPoint, imageUrl, timer, status, idCine) VALUES('%s', '%s', %d,'%s', %d, %d, %s)",jsonData.OrderNum,jsonData.CustomerName,jsonData.DeliveryPoint,jsonData.ImageUrl,jsonData.Timer,jsonData.Status,idCine)
    // fmt.Printf(sql)
    // fmt.Printf("\n")
    // fmt.Printf(idCine)
    res, err := app.DB.Exec(sql)
    checkErr(err)

    // fmt.Printf("=======================\n")
    //var inserted Order
    // fmt.Printf("%+v\n",res)
    // fmt.Printf("=======================\n")

    id, err := res.LastInsertId()
    checkErr(err)
    idCineInt, err := strconv.Atoi(idCine)
    jsonData.IdOrder = int(id)
    jsonData.IdCine = idCineInt

    //id, err := res.LastInsertId()
    //checkErr(err)
    //fmt.Println(id)
    // timerInt, err := strconv.ParseInt(timer,10,32)
    checkErr(err)
    //defer res.Close()
    time.AfterFunc(300*time.Second, func()  {
        // fmt.Printf("===UPDATE===")
    updt := fmt.Sprintf("DELETE FROM Orders WHERE idOrder=%d AND idCine=%s",id,idCine)
        rows, err := app.DB.Query(updt)
        checkErr(err)
        defer rows.Close()

        //fmt.Println(rows)
    })
    data := make(map[string]interface{})
    data["error"] = nil
    data["data"] = jsonData
    return c.RenderJSON(data)
}

func (c App) UpdateOrder() revel.Result {
    idCine := c.Params.Route.Get("idCine")
    var jsonData  Order
    c.Params.BindJSON(&jsonData)
    idCineInt, err := strconv.Atoi(idCine)

    // fmt.Printf("===UPDATE===")
    dlt := fmt.Sprintf("DELETE FROM Orders WHERE orderNum='%s' AND idCine=%s",jsonData.OrderNum,idCine)
    rows, err := app.DB.Query(dlt)
    checkErr(err)
    fmt.Println(rows)
    //jsonData.IdOrder = int(id)
    jsonData.IdCine = idCineInt
    defer rows.Close()
    data := make(map[string]interface{})
    data["error"] = nil
    data["data"] = jsonData
    return c.RenderJSON(data)
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

最佳答案

EventSource接口(interface)要求请求和响应的内容类型是text/event-stream,而不是application/jsontext/html等。并且它在客户端和服务器上需要相同的字符集。

所以我认为您可以尝试检查您的请求和响应是否包含 Content-Type header 。

对于服务器端,为 /stream 处理程序添加代码 c.Response.ContentType = "text/event-stream"

关于javascript - 是什么导致 eventSource 停留在 readyState 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55751259/

相关文章:

javascript - 使用 d3.js 获取选中的单选按钮的值

c# - Graph API - 使用 .Net Core 3.1 添加架构扩展

python - 如何从 Python Runbook 中的 Log Analytics 工作区获取共享 key ?

json - Golang 将 JSON 数组解析成数据结构

go - 'go run -gcflags -m xxx.go' 的输出是什么意思

javascript - 使用 XMLHttpRequest 将代码片段提交到数据库

javascript - 使用 Javascript 动态更改值

javascript - 相同条件下的多个 onclick 函数

apns Sharp 中的 iPhone 证书错误 对 SSPI 的调用失败

go - 追加到磁盘文件中的 golang gob