【发布时间】:2021-10-16 12:09:15
【问题描述】:
我想创建一个实时 API。 Github Link of current code
将有两种类型的用户 A 和 B。 用户 A 可以使用 websocket 连接到服务以查看实时更新。 用户 B 只能发出 http 请求将数据推送到 mongodb。我一直在关注this tutorial。在本教程中使用了 sqlitedb 和 redis pub/sub,但我不想使用它。
...
func (server *WsServer) Run() {
gb := *models.GetInstanceGlobal()
for {
select {
case client := <-server.register:
server.registerClient(client)
case client := <-server.unregister:
server.unregisterClient(client)
case message := <-server.broadcast:
server.broadcastToClient(message)
case message := <-gb.Channel:
server.createRoomAndBroadCast(message)
}
}
}
...
func (server *WsServer) createRoom(name string) *Room {
room := NewRoom(name)
go room.RunRoom()
server.rooms[room] = true
return room
}
func (server *WsServer) createRoomAndBroadCast(name string) {
room := server.createRoom(name)
var roomList []string
for r := range server.rooms {
roomList = append(roomList, r.GetName())
}
addRoomReply := models.AddRoomReply{
RoomList: roomList,
AddedRoom: room.GetName(),
}
addReply := MessageAddRoom{
Data: addRoomReply,
Action: "room-add-success",
}
server.broadcast <- addReply.encode()
}
我正在尝试收听全球频道。如果一个字符串被推送到它,一个函数 createRoomAndBroadCast 将被调用。
....
type GlobalChannel struct {
Channel chan string
}
func GetInstanceGlobal() *GlobalChannel {
return &GlobalChannel{
Channel: make(chan string),
}
}
我正在 POST 消息处理程序中写入此频道
...
//add room to mongo
if err := db.CreateRoom(&room); err != nil {
ctx.JSON(http.StatusBadGateway, gin.H{
"data": err,
})
return
}
//write it to channel
gb := models.GetInstanceGlobal()
gb.Channel <- *room.Name
// send reponse to user
ctx.JSON(http.StatusCreated, gin.H{
"data": "Room Created Successfully",
})
...
但我的发帖请求卡在 gb := models.GetInstanceGlobal() 行 在日志中,我看到以下消息
redirecting request 307: /api/v1/room/ --> /api/v1/room/
我不明白是我做错了什么还是我的逻辑完全错误。
【问题讨论】:
标签: go websocket publish-subscribe gorilla