update keepKeyCase to default true
add requires for verify args fix bug of load config from yml fix bug of can't stop on kill
This commit is contained in:
		
							parent
							
								
									e1dc87d733
								
							
						
					
					
						commit
						d416c61a6a
					
				
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.mod
									
									
									
									
									
								
							@ -3,17 +3,17 @@ module apigo.cc/gojs/service
 | 
			
		||||
go 1.18
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	apigo.cc/gojs v0.0.3
 | 
			
		||||
	apigo.cc/gojs v0.0.4
 | 
			
		||||
	apigo.cc/gojs/console v0.0.1
 | 
			
		||||
	apigo.cc/gojs/http v0.0.3
 | 
			
		||||
	apigo.cc/gojs/util v0.0.2
 | 
			
		||||
	apigo.cc/gojs/util v0.0.3
 | 
			
		||||
	github.com/gorilla/websocket v1.5.3
 | 
			
		||||
	github.com/ssgo/config v1.7.8
 | 
			
		||||
	github.com/ssgo/discover v1.7.9
 | 
			
		||||
	github.com/ssgo/httpclient v1.7.8
 | 
			
		||||
	github.com/ssgo/log v1.7.7
 | 
			
		||||
	github.com/ssgo/redis v1.7.7
 | 
			
		||||
	github.com/ssgo/s v1.7.17
 | 
			
		||||
	github.com/ssgo/s v1.7.18
 | 
			
		||||
	github.com/ssgo/standard v1.7.7
 | 
			
		||||
	github.com/ssgo/u v1.7.9
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										42
									
								
								service.go
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								service.go
									
									
									
									
									
								
							@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -66,10 +67,17 @@ var serviceConfig Config
 | 
			
		||||
var onStop goja.Callable
 | 
			
		||||
 | 
			
		||||
var limiters = map[string]*s.Limiter{}
 | 
			
		||||
var configed = false
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	s.Config.KeepKeyCase = true
 | 
			
		||||
	obj := map[string]any{
 | 
			
		||||
		"config": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
 | 
			
		||||
			configed = true
 | 
			
		||||
			s.InitConfig()
 | 
			
		||||
			if startPath, ok := vm.GoData["startPath"]; ok {
 | 
			
		||||
				s.SetWorkPath(u.String(startPath))
 | 
			
		||||
			}
 | 
			
		||||
			// 处理配置
 | 
			
		||||
			args := gojs.MakeArgs(&argsIn, vm)
 | 
			
		||||
			serviceConfig = Config{"Session", "Device", "Client", "userId", "", 3600, "auth failed", "verify failed", "too many requests", nil, "", map[string]string{}, map[string]string{}, map[string]string{}}
 | 
			
		||||
@ -165,6 +173,9 @@ func init() {
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
		"start": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
 | 
			
		||||
			if !configed {
 | 
			
		||||
				panic(vm.NewGoError(errors.New("must run service.config frist")))
 | 
			
		||||
			}
 | 
			
		||||
			if server != nil {
 | 
			
		||||
				panic(vm.NewGoError(errors.New("server already started")))
 | 
			
		||||
			}
 | 
			
		||||
@ -190,6 +201,9 @@ func init() {
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
			server.OnStopped(func() {
 | 
			
		||||
				ClearRewritesAndProxies()
 | 
			
		||||
				pools = map[string]*gojs.Pool{}
 | 
			
		||||
				server = nil
 | 
			
		||||
				if waitChan != nil {
 | 
			
		||||
					waitChan <- true
 | 
			
		||||
				}
 | 
			
		||||
@ -201,9 +215,6 @@ func init() {
 | 
			
		||||
				panic(vm.NewGoError(errors.New("server not started")))
 | 
			
		||||
			}
 | 
			
		||||
			server.Stop()
 | 
			
		||||
			ClearRewritesAndProxies()
 | 
			
		||||
			pools = map[string]*gojs.Pool{}
 | 
			
		||||
			server = nil
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
		"register": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
 | 
			
		||||
@ -225,6 +236,13 @@ func init() {
 | 
			
		||||
					usedLimiters = append(usedLimiters, limiter1)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if requiresObj := o.Array("requires"); requiresObj != nil {
 | 
			
		||||
				requires := make([]string, len(requiresObj))
 | 
			
		||||
				for i, require := range requiresObj {
 | 
			
		||||
					requires[i] = u.String(require)
 | 
			
		||||
				}
 | 
			
		||||
				vm.GoData[fmt.Sprint("REQUIRE_"+host, method, path)] = requires
 | 
			
		||||
			}
 | 
			
		||||
			if verifiesObj := o.Obj("verifies"); verifiesObj != nil {
 | 
			
		||||
				verifiesSet := map[string]func(any, *goja.Runtime) bool{}
 | 
			
		||||
				for _, field := range verifiesObj.Keys() {
 | 
			
		||||
@ -319,7 +337,8 @@ func init() {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !u.FileExists(actionFile) {
 | 
			
		||||
				panic(vm.NewGoError(errors.New("actionFile must be a js file path")))
 | 
			
		||||
				fullActionFile, _ := filepath.Abs(actionFile)
 | 
			
		||||
				panic(vm.NewGoError(errors.New("actionFile must be a js file path: " + fullActionFile)))
 | 
			
		||||
			}
 | 
			
		||||
			actionCode := u.ReadFileN(actionFile)
 | 
			
		||||
			if !strings.Contains(actionCode, "function main(") || !strings.Contains(actionCode, ".register(") {
 | 
			
		||||
@ -363,7 +382,6 @@ func init() {
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				panic(vm.NewGoError(err))
 | 
			
		||||
			}
 | 
			
		||||
			println(u.BMagenta("taskFile: "), taskFile, interval)
 | 
			
		||||
			s.NewTimerServer(taskFile, time.Duration(interval)*time.Millisecond, func(isRunning *bool) {
 | 
			
		||||
				rt.RunCode("if(onRun)onRun()")
 | 
			
		||||
			}, func() {
 | 
			
		||||
@ -390,6 +408,11 @@ func init() {
 | 
			
		||||
		Object:  obj,
 | 
			
		||||
		TsCode:  serviceTS,
 | 
			
		||||
		Example: serviceMD,
 | 
			
		||||
		OnKill: func() {
 | 
			
		||||
			if server != nil {
 | 
			
		||||
				server.Stop()
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		WaitForStop: func() {
 | 
			
		||||
			if waitChan != nil {
 | 
			
		||||
				<-waitChan
 | 
			
		||||
@ -487,6 +510,15 @@ func runAction(action goja.Callable, vm *goja.Runtime, thisArg goja.Value, args
 | 
			
		||||
	// 验证请求参数的有效性
 | 
			
		||||
	if verifies, ok := vm.GoData["VERIFY_"+u.String(request.Get("registerTag"))].(map[string]func(any, *goja.Runtime) bool); ok {
 | 
			
		||||
		failedFields := make([]string, 0)
 | 
			
		||||
		// 检查必填字段
 | 
			
		||||
		if requires, ok := vm.GoData["REQUIRE_"+u.String(request.Get("registerTag"))].([]string); ok {
 | 
			
		||||
			for _, requireField := range requires {
 | 
			
		||||
				if _, ok := args[requireField]; !ok {
 | 
			
		||||
					failedFields = append(failedFields, requireField)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		// 验证数据有效性
 | 
			
		||||
		for k, v := range args {
 | 
			
		||||
			if verifier, ok1 := verifies[k]; ok1 {
 | 
			
		||||
				if !verifier(v, vm) {
 | 
			
		||||
 | 
			
		||||
@ -75,7 +75,7 @@ interface Config {
 | 
			
		||||
    memoryLimitTimes: number                    // 内存超过最高占用值超过次数(1-100)将报警(如果MemoryMonitor开启的话),默认6(即30秒内连续6次)
 | 
			
		||||
    cookieScope: string                         // 启用Session时Cookie的有效范围,host|domain|topDomain,默认值为host
 | 
			
		||||
    idServer: string                            // 用s.UniqueId、s.Id来生成唯一ID(雪花算法)时所需的redis服务器连接,如果不指定将不能实现跨服务的全局唯一
 | 
			
		||||
    keepKeyCase: boolean                        // 是否保持Key的首字母大小写?默认一律使用小写
 | 
			
		||||
    keepKeyCase: boolean                        // 是否保持Key的首字母大小写?默认保持,设置为false则自动将首字母转为小写
 | 
			
		||||
    indexFiles: string[]                        // 访问静态文件时的索引文件,默认为 index.html
 | 
			
		||||
    indexDir: boolean                           // 访问目录时显示文件列表
 | 
			
		||||
    readTimeout: number                         // 读取请求的超时时间,单位ms
 | 
			
		||||
@ -145,6 +145,8 @@ interface RegisterOption {
 | 
			
		||||
    noBody: boolean
 | 
			
		||||
    noLog200: boolean
 | 
			
		||||
    limiters: string[]
 | 
			
		||||
    verifies: Object
 | 
			
		||||
    requires: string[]
 | 
			
		||||
    onMessage: (params: OnMessageParams) => void
 | 
			
		||||
    onClose: (params: RequestParams) => void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user