douyi6168 2019-04-18 17:44
浏览 284

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

I have a go app on azure that generates SSE connections depending on an id sent in the url as the event source '.co/stream/{id}'. One of those ids has been used more frequently than others and has stopped connecting but any other id connect just fine. The app is in an ubuntu VM.

The client connects with a vue app.

I'm not sure if azure is blocking the url or if there's a limit on connections?

Things I've tried:

Endpoints and ports have been configured in the network config in azure. Restarting the app and server works for a few minutes (5-10 min) but then get an Err_Connection_Refused on the client. Cpu and ram usage is very low on the vm

client

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

backend connects to a mysql db and generates a json for the client message


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
", 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("
")
    // fmt.Printf(jsonData.OrderNum)
    // fmt.Printf("
")

    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("
")
    // fmt.Printf(idCine)
    res, err := app.DB.Exec(sql)
    checkErr(err)

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

    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条回答 默认 最新

  • du59131 2019-04-22 08:57
    关注

    The EventSource interface requires that the content type of request and response is text/event-stream, not application/json or text/html or others. And it need the same charset on both of client and server.

    So I think you can try to check your request and response for Content-Type header.

    For server-side, to add the code c.Response.ContentType = "text/event-stream" for the /stream handler.

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!