Что заставляет eventSource оставаться на readyState 0? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть приложение go на Azure, которое генерирует соединения SSE в зависимости от идентификатора, отправляемого в URL в качестве источника события '.co / stream / {id}'.Один из этих идентификаторов использовался чаще других и прекратил подключение, но любой другой идентификатор подключился просто отлично.Приложение находится в виртуальной машине Ubuntu.

Клиент соединяется с приложением vue.

Я не уверен, блокирует ли Azure URL-адрес или существует ли ограничение на количество подключений?

Вещи, которые я пробовал:

Конечные точки и порты были настроены в конфигурации сети в Azure.Перезапуск приложения и сервера работает в течение нескольких минут (5-10 минут), но затем используется Err_Connection_Refused на клиенте.Использование процессора и оперативной памяти очень низкое на бэкэнде 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');
}

подключается к базе данных 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 голосов
/ 22 апреля 2019

Интерфейс EventSource требует, чтобы тип содержимого запроса и ответа был text/event-stream, а не application/json или text/html или другие.И ему нужен один и тот же набор символов как на клиенте, так и на сервере.

Так что я думаю, что вы можете попробовать проверить ваш запрос и ответ для заголовка Content-Type.

Для добавления на стороне сервера, чтобы добавитькод c.Response.ContentType = "text/event-stream" для обработчика /stream.

...