{"record":{"id":"e8f2fb720edf36c2","repo":"siyuan-note/siyuan","slug":"method-name-and-function-required","errorCode":null,"errorMessage":"method name and function required","messagePattern":"method name and function required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/plugin/api_rpc.go","lineNumber":46,"sourceCode":"// injectRpc adds siyuan.rpc method for RPC method registration.\nfunc injectRpc(p *KernelPlugin, rt *goja.Runtime, siyuan *goja.Object) (err error) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = fmt.Errorf(\"injectRpc: %v\", r)\n\t\t}\n\t}()\n\n\trpc := rt.NewObject()\n\n\tlo.Must0(rpc.Set(\"bind\", rt.ToValue(func(call goja.FunctionCall, rt *goja.Runtime) goja.Value {\n\t\tpromise, resolve, reject := rt.NewPromise()\n\n\t\tvar argErr error\n\t\tvar name string\n\t\tvar method goja.Callable\n\t\tvar descriptions []string\n\t\tif len(call.Arguments) < 2 {\n\t\t\targErr = fmt.Errorf(\"method name and function required\")\n\t\t} else {\n\t\t\tnameArg := call.Argument(0)\n\t\t\tmethodArg := call.Argument(1)\n\t\t\tdescArgs := call.Arguments[2:]\n\t\t\tif goja.IsString(nameArg) {\n\t\t\t\tname = nameArg.String()\n\t\t\t} else {\n\t\t\t\targErr = fmt.Errorf(\"first argument must be method name string\")\n\t\t\t}\n\t\t\tif argErr == nil {\n\t\t\t\tif methodJs, ok := goja.AssertFunction(methodArg); ok {\n\t\t\t\t\tmethod = methodJs\n\t\t\t\t} else {\n\t\t\t\t\targErr = fmt.Errorf(\"second argument must be a function\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif argErr == nil {\n\t\t\t\tdescriptions = make([]string, len(descArgs))","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/plugin/api_rpc.go#L28-L64","documentation":"Thrown by siyuan.rpc.bind when fewer than 2 arguments are passed. bind(name, fn, ...descriptions) registers an RPC method and requires at least a name and a handler function.","triggerScenarios":"Calling bind('name') with no handler, or bind() with no args. len(call.Arguments) < 2 at api_rpc.go:45.","commonSituations":"Plugin registers an RPC method but forgets the handler, or passes the handler inside an options object by mistake.","solutions":["Pass both name and function: siyuan.rpc.bind('add', (params) => params.a + params.b)."],"exampleFix":"// before\nsiyuan.rpc.bind('add');\n// after\nsiyuan.rpc.bind('add', (params) => params.a + params.b);","handlingStrategy":"validation","validationCode":"if (arguments.length < 2) throw new Error('name and handler required');\nsiyuan.rpc.bind(name, fn);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass name + handler.","Use a registration helper that checks arity."],"tags":["rpc","bind","validation","argument"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}