Przeglądaj źródła

feature(Error): rpcx返回值序列化问题

ZZH-wl 3 lat temu
rodzic
commit
0dbcdd956e

+ 6 - 9
opms_admin/app/handler/auth.go

@@ -2,20 +2,17 @@ package handler
 
 import (
 	"context"
-	"dashoo.cn/opms_libary/myerrors"
-
 	"dashoo.cn/common_definition/admin/user_def"
+	"dashoo.cn/common_definition/auth"
 	"dashoo.cn/common_definition/comm_def"
+	"dashoo.cn/micro/app/service"
 	"dashoo.cn/opms_libary/gtoken"
 	"dashoo.cn/opms_libary/micro_srv"
+	"dashoo.cn/opms_libary/myerrors"
 	"github.com/gogf/gf/encoding/gjson"
 	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/os/glog"
 	"github.com/gogf/gf/util/gconv"
-
-	"dashoo.cn/micro/app/service"
-
-	"dashoo.cn/common_definition/auth"
 )
 
 type AuthHandler struct{}
@@ -72,7 +69,7 @@ func (h *AuthHandler) LogOut(ctx context.Context, req interface{}, rsp *comm_def
 	return nil
 }
 
-func (h *AuthHandler) GetToken(ctx context.Context, req *auth.Request, rsp *auth.Response) (err error) {
+func (h *AuthHandler) GetToken(ctx context.Context, req *auth.Request, rsp *comm_def.CommonMsg) (err error) {
 	glog.Info("Received AuthHandler.GetToken request, UserKey:", req.UserKey, " @ ", req.Tenant)
 	// 获取Data,换成对象
 	var json interface{}
@@ -90,7 +87,7 @@ func (h *AuthHandler) GetToken(ctx context.Context, req *auth.Request, rsp *auth
 	return nil
 }
 
-func (h *AuthHandler) RemoveToken(ctx context.Context, reqToken string, rsp *auth.Response) error {
+func (h *AuthHandler) RemoveToken(ctx context.Context, reqToken string, rsp *comm_def.CommonMsg) error {
 	glog.Info("Received AuthHandler.RemoveToken request, token:", reqToken)
 	tokenResp := gtoken.GFToken.RemoveToken(reqToken)
 	if err := gconv.Struct(tokenResp, rsp); err != nil {
@@ -99,7 +96,7 @@ func (h *AuthHandler) RemoveToken(ctx context.Context, reqToken string, rsp *aut
 	return nil
 }
 
-func (h *AuthHandler) ValidToken(ctx context.Context, reqToken string, rsp *auth.Response) error {
+func (h *AuthHandler) ValidToken(ctx context.Context, reqToken string, rsp *comm_def.CommonMsg) error {
 	glog.Info("Received AuthHandler.ValidToken request, token:", reqToken)
 	tokenResp := gtoken.GFToken.ValidToken(reqToken)
 	if err := gconv.Struct(tokenResp, rsp); err != nil {

+ 3 - 4
opms_libary/micro_srv/micro_srv.go

@@ -2,6 +2,7 @@ package micro_srv
 
 import (
 	"context"
+	"dashoo.cn/common_definition/comm_def"
 	"dashoo.cn/opms_libary/dynamic"
 	"dashoo.cn/opms_libary/gtoken"
 	"dashoo.cn/opms_libary/mutipart"
@@ -30,8 +31,6 @@ import (
 	"github.com/smallnest/rpcx/server"
 	"github.com/smallnest/rpcx/serverplugin"
 	"github.com/smallnest/rpcx/share"
-
-	"dashoo.cn/common_definition/auth"
 )
 
 // InitMicroSrvClient 获取微服务客户端,arg为可选参数,若有必须是两个,分别是:reg string, serverAddr string
@@ -198,7 +197,7 @@ func HandleAuth(ctx context.Context, req *protocol.Message, token string, authEx
 		}
 
 		//return errors.New("InvalidToken")
-		if rsp.Code != 0 {
+		if rsp.Code != 0 && rsp.Code != 200 {
 			return myerrors.AuthError()
 		}
 
@@ -259,7 +258,7 @@ func validToken(token string) gtoken.Resp {
 
 	authService := InitMicroSrvClient("Auth", "micro_srv.auth")
 	defer authService.Close()
-	rsp := &auth.Response{}
+	rsp := &comm_def.CommonMsg{}
 	err := authService.Call(context.TODO(), "ValidToken", token, rsp)
 	if err != nil {
 		g.Log().Error(err)

+ 87 - 69
opms_libary/myerrors/error.go

@@ -2,27 +2,28 @@ package myerrors
 
 import (
 	"context"
+	"dashoo.cn/common_definition/comm_def"
 	"github.com/gogf/gf/errors/gcode"
 	"github.com/gogf/gf/errors/gerror"
 	"github.com/gogf/gf/frame/g"
-	"github.com/gogf/gf/util/gconv"
+	"github.com/smallnest/rpcx/codec"
 	"github.com/smallnest/rpcx/protocol"
 	"strings"
 )
 
 var (
-	CodeTipsErr      = gcode.New(1001, "错误提示", nil)
-	CodeValidErr     = gcode.New(1002, "数据校验失败", nil)
-	CodeQueryErr     = gcode.New(1003, "%s查询失败", nil)
-	CodeCreateErr    = gcode.New(1004, "%s创建失败", nil)
-	CodeUpdateErr    = gcode.New(1005, "%s更新失败", nil)
-	CodeDeleteErr    = gcode.New(1006, "%s删除失败", nil)
-	CodeAuthErr      = gcode.New(1010, "登录失效或认证失败,请重新尝试", nil)
-	CodePermErr      = gcode.New(1011, "权限验证失败,请重新尝试", nil)
-	CodeMicroCallErr = gcode.New(1100, "微服务调用失败,请重新尝试", nil)
-	CodeConvErr      = gcode.New(1200, "数据转换异常,请重新尝试", nil)
-	CodeDbErr        = gcode.New(1201, "数据库操作异常,请重新尝试", nil)
-	CodeSysErr       = gcode.New(500, "系统异常,请重新尝试", nil)
+	codeTipsErr      = gcode.New(1001, "错误提示", nil)
+	codeValidErr     = gcode.New(1002, "数据校验失败", nil)
+	codeQueryErr     = gcode.New(1003, "%s查询失败", nil)
+	codeCreateErr    = gcode.New(1004, "%s创建失败", nil)
+	codeUpdateErr    = gcode.New(1005, "%s更新失败", nil)
+	codeDeleteErr    = gcode.New(1006, "%s删除失败", nil)
+	codeAuthErr      = gcode.New(1010, "登录失效或认证失败,请重新尝试", nil)
+	codePermErr      = gcode.New(1011, "权限验证失败,请重新尝试", nil)
+	codeMicroCallErr = gcode.New(1100, "微服务调用失败,请重新尝试", nil)
+	codeConvErr      = gcode.New(1200, "数据转换异常,请重新尝试", nil)
+	codeDbErr        = gcode.New(1201, "数据库操作异常,请重新尝试", nil)
+	codeSysErr       = gcode.New(500, "系统异常,请重新尝试", nil)
 )
 
 //	func New(errCode int, err error, errMsg ...string) error {
@@ -32,40 +33,40 @@ var (
 //		return gerror.WrapCode(errCode, err, handleErrMsg(ConvErr, errMsg...))
 //	}
 func TipsError(errMsg string) error {
-	return gerror.NewCode(CodeTipsErr, errMsg)
+	return gerror.NewCode(codeTipsErr, errMsg)
 }
 func ValidError(errMsg ...string) error {
-	return gerror.NewCode(CodeValidErr, handleErrMsg(CodeValidErr, errMsg...))
+	return gerror.NewCode(codeValidErr, handleErrMsg(codeValidErr, errMsg...))
 }
 func QueryError(err error, module string) error {
-	return gerror.WrapCodef(CodeQueryErr, err, CodeQueryErr.Message(), module)
+	return gerror.WrapCodef(codeQueryErr, err, codeQueryErr.Message(), module)
 }
 func CreateError(err error, module string) error {
-	return gerror.WrapCodef(CodeCreateErr, err, CodeCreateErr.Message(), module)
+	return gerror.WrapCodef(codeCreateErr, err, codeCreateErr.Message(), module)
 }
 func UpdateError(err error, module string) error {
-	return gerror.WrapCodef(CodeUpdateErr, err, CodeUpdateErr.Message(), module)
+	return gerror.WrapCodef(codeUpdateErr, err, codeUpdateErr.Message(), module)
 }
 func DeleteError(err error, module string) error {
-	return gerror.WrapCodef(CodeDeleteErr, err, CodeDeleteErr.Message(), module)
+	return gerror.WrapCodef(codeDeleteErr, err, codeDeleteErr.Message(), module)
 }
 func AuthError(errMsg ...string) error {
-	return gerror.NewCode(CodeAuthErr, handleErrMsg(CodeAuthErr, errMsg...))
+	return gerror.NewCode(codeAuthErr, handleErrMsg(codeAuthErr, errMsg...))
 }
 func PermError(errMsg ...string) error {
-	return gerror.NewCode(CodePermErr, handleErrMsg(CodePermErr, errMsg...))
+	return gerror.NewCode(codePermErr, handleErrMsg(codePermErr, errMsg...))
 }
 func MicroCallError(errMsg ...string) error {
-	return gerror.NewCode(CodeMicroCallErr, handleErrMsg(CodeMicroCallErr, errMsg...))
+	return gerror.NewCode(codeMicroCallErr, handleErrMsg(codeMicroCallErr, errMsg...))
 }
 func ConvError(errMsg ...string) error {
-	return gerror.NewCode(CodeConvErr, handleErrMsg(CodeConvErr, errMsg...))
+	return gerror.NewCode(codeConvErr, handleErrMsg(codeConvErr, errMsg...))
 }
 func DbError(errMsg ...string) error {
-	return gerror.NewCode(CodeDbErr, handleErrMsg(CodeDbErr, errMsg...))
+	return gerror.NewCode(codeDbErr, handleErrMsg(codeDbErr, errMsg...))
 }
 func SysError() error {
-	return gerror.NewCode(CodeSysErr, CodeSysErr.Message())
+	return gerror.NewCode(codeSysErr, codeSysErr.Message())
 }
 
 func handleErrMsg(errCode gcode.Code, errMsg ...string) string {
@@ -78,59 +79,76 @@ func handleErrMsg(errCode gcode.Code, errMsg ...string) string {
 
 type HandleErrorPlugin struct{}
 
+func (p HandleErrorPlugin) getSerializeType(mes *protocol.Message) codec.Codec {
+	var serializer codec.Codec
+	switch mes.SerializeType() {
+	case protocol.SerializeNone:
+		return nil
+	case protocol.JSON:
+		serializer = codec.JSONCodec{}
+	case protocol.ProtoBuffer:
+		serializer = codec.PBCodec{}
+	case protocol.MsgPack:
+		serializer = codec.MsgpackCodec{}
+	case protocol.Thrift:
+		serializer = codec.ThriftCodec{}
+	}
+	return serializer
+}
+
 func (p HandleErrorPlugin) PreWriteResponse(ctx context.Context, req *protocol.Message, res *protocol.Message, err error) error {
+	resData := new(comm_def.CommonMsg)
+	serializer := p.getSerializeType(res)
 	if err == nil {
 		// todo 正常数据处理
-		resData := gconv.Map(res.Payload)
-		resData["code"] = 200
-		if val, ok := resData["msg"]; !ok || val == "" {
-			resData["msg"] = "操作成功"
+		if serializerErr := serializer.Decode(res.Payload, resData); serializerErr != nil {
+			return serializerErr
 		}
-		res.Payload = gconv.Bytes(gconv.String(resData))
+
+		if resData.Code == 0 {
+			resData.Code = 200
+		}
+		if resData.Msg == "" {
+			resData.Msg = "操作成功"
+		}
+		res.Payload, _ = serializer.Encode(resData)
 		return nil
 	}
 	// error 堆栈信息输出
 	g.Log().Error(gerror.Stack(err))
 	topCode := gerror.Code(err).Code()
-	if topCode > 0 {
-		// 默认返回系统级异常处理
-		var resData = g.Map{
-			"code": CodeSysErr.Code(),
-			"msg":  CodeSysErr.Message(),
-		}
-		// 检查是否存在二级错误,如存在取底层错误信息
-		gNextError := gerror.Next(err)
-		nextErrCode := topCode
-		if gNextError != nil {
-			nextErrCode = gerror.Code(gNextError).Code()
-		}
-		switch true {
-		case nextErrCode > 1000:
-			// 业务级异常处理
-			resData = g.Map{
-				"code": topCode,
-				"msg":  err,
-			}
-		case nextErrCode > 0 && topCode > 1000:
-			// 检查是否存在业务信息,添加显示
-			resData = g.Map{
-				"code": topCode,
-				"msg":  splitErrorStr(err.Error()),
-			}
-		case nextErrCode == 51:
-			// 检查是否存在业务信息,添加显示
-			resData = g.Map{
-				"code": CodeValidErr.Code(),
-				"msg":  CodeValidErr.Message() + ": " + err.Error(),
-			}
-		default:
+	// 检查是否存在二级错误,如存在取底层错误信息
+	gNextError := gerror.Next(err)
+	nextErrCode := topCode
+	if gNextError != nil {
+		nextErrCode = gerror.Code(gNextError).Code()
+	}
+	switch true {
+	case nextErrCode > 1000:
+		// 业务级异常处理
+		resData.Code = int32(topCode)
+		resData.Msg = err.Error()
 
-		}
-		res.Payload = gconv.Bytes(gconv.String(resData))
-		res.SetMessageStatusType(protocol.Normal)
-		if res.Metadata != nil {
-			delete(res.Metadata, protocol.ServiceError)
-		}
+	case nextErrCode == gcode.CodeValidationFailed.Code():
+		// goframe 数据校验
+		// 检查是否存在业务信息,添加显示
+		resData.Code = int32(codeValidErr.Code())
+		resData.Msg = codeValidErr.Message() + ": " + err.Error()
+
+	case nextErrCode > 0 && topCode > 1000:
+		// 检查是否存在业务信息,添加显示
+		resData.Code = int32(topCode)
+		resData.Msg = splitErrorStr(err.Error())
+
+	default:
+		// 默认返回系统级异常处理
+		resData.Code = int32(codeSysErr.Code())
+		resData.Msg = codeSysErr.Message()
+	}
+	res.Payload, _ = serializer.Encode(resData)
+	res.SetMessageStatusType(protocol.Normal)
+	if res.Metadata != nil {
+		delete(res.Metadata, protocol.ServiceError)
 	}
 
 	return nil
@@ -138,5 +156,5 @@ func (p HandleErrorPlugin) PreWriteResponse(ctx context.Context, req *protocol.M
 
 func splitErrorStr(errMsg string) string {
 	errStrIndex := strings.Index(errMsg, ": ")
-	return errMsg[:errStrIndex] + ": " + CodeSysErr.Message()
+	return errMsg[:errStrIndex] + ": " + codeSysErr.Message()
 }