是什么导致eventSource保持readyState 0?

问题描述 投票:0回答:1

我在azure上有一个go应​​用程序,它根据在url中发送的id作为事件源'.co / stream / {id}'生成SSE连接。其中一个ID比其他ID更常用,并且已停止连接,但任何其他id连接都很好。该应用程序位于ubuntu VM中。

客户端连接vue应用程序。

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

我试过的事情:

已在网络配置中使用azure配置端点和端口。重新启动应用程序和服务器可以工作几分钟(5-10分钟),但随后在客户端上获得Err_Connection_Refused。虚拟机上的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)
    }
}

javascript azure go revel
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.