Browse Source

change middle function rule

Joyit 1 tháng trước cách đây
mục cha
commit
ebdc14405c
3 tập tin đã thay đổi với 14 bổ sung1 xóa
  1. 2 0
      config/config.go
  2. 9 0
      hub.go
  3. 3 1
      type.go

+ 2 - 0
config/config.go

@@ -5,6 +5,8 @@ const (
 	MIN_SYSTEM_ERROR_CODE = 110 // 系统信息最小值
 	NEXT_SUBSCRIBE        = 111
 	NEXT_SUBSCRIBE_MSG    = "NEXT SUBSCRIBE"
+	NEXT_MIDDLE           = 112
+	NEXT_MIDDLE_MSG       = "NEXT MIDDLE"
 	FORBIDDEN             = 120
 	FORBIDDEN_MSG         = "FORBIDDEN"
 	SYSTEM_ERROR          = 123

+ 9 - 0
hub.go

@@ -95,6 +95,8 @@ func (h *Hub) GetID() uint16 {
 }
 
 // 添加中间件
+// 如果中间件函数返回为空,表示处理完成,通过
+// 如果中间件函数返回 NEXT_MIDDLE,表示需要下一个中间件函数处理;如果没有下一函数则默认通过
 func (h *Hub) UseMiddle(middleFunc MiddleFunc) {
 	h.middle = append(h.middle, middleFunc)
 }
@@ -276,11 +278,18 @@ func (h *Hub) requestFromNet(request *RequestData) {
 	for _, mdFunc := range h.middle {
 		rsp := mdFunc(request)
 		if rsp != nil {
+			// NEXT_MIDDLE 表示当前的函数没有处理完成,还需要下个中间件处理
+			if rsp.State == config.NEXT_MIDDLE {
+				continue
+			}
+			// 返回消息
 			if request.Id != 0 {
 				rsp.Id = request.Id
 				request.conn.sendResponse <- rsp
 			}
 			return
+		} else {
+			break
 		}
 	}
 	sub, ok := h.subscribes.Load(cmd)

+ 3 - 1
type.go

@@ -5,7 +5,9 @@ import (
 	"time"
 )
 
-// 中间件函数,如果返回为nil则继续循环到下个中间件,如果返回不为空则直接返回结果
+// 中间件函数
+// 如果返回为空,表示处理完成,通过
+// 如果返回 NEXT_MIDDLE,表示需要下一个中间件函数处理;如果没有下一函数则默认通过
 type MiddleFunc func(request *RequestData) (response *ResponseData)
 
 // 订阅频道响应函数