是什么导致eventSource保持在readyState 0上?

时间:2019-04-18 17:44:21

标签: javascript azure go revel

我在azure上有一个go应​​用,该应用根据在URL中作为事件源'.co / stream / {id}'发送的ID生成SSE连接。 这些ID之一比其他ID的使用频率更高,并且已停止连接,但其他任何ID都可以正常连接。该应用程序位于ubuntu VM中。

客户端连接到vue应用。

我不确定azure是否阻止了该网址或连接是否受到限制?

我尝试过的事情:

端点和端口已经在蔚蓝的网络配置中进行了配置。 重新启动应用程序和服务器的过程需要几分钟(5-10分钟),但是在客户端上会出现Err_Connection_Refused。 vm上的cpu和ram使用率很低

客户端

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

1 个答案:

答案 0 :(得分:0)

EventSource界面要求请求和响应的内容类型为text/event-stream,而不是application/jsontext/html或其他。而且客户端和服务器上都需要相同的字符集。

所以我认为您可以尝试检查Content-Type标头的请求和响应。

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