我在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)
}
}
答案 0 :(得分:0)
EventSource
界面要求请求和响应的内容类型为text/event-stream
,而不是application/json
或text/html
或其他。而且客户端和服务器上都需要相同的字符集。
所以我认为您可以尝试检查Content-Type
标头的请求和响应。
对于服务器端,为c.Response.ContentType = "text/event-stream"
处理程序添加代码/stream
。