{"record":{"id":"308b54f0d00742dd","repo":"louislam/dockge","slug":"invalid-stackname-or-servicename","errorCode":null,"errorMessage":"Invalid stackName or serviceName","messagePattern":"Invalid stackName or serviceName","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"backend/agent-socket-handlers/docker-socket-handler.ts","lineNumber":307,"sourceCode":"\n                const stack = await Stack.getStack(server, stackName);\n                await stack.stopService(socket, serviceName);\n                callbackResult({\n                    ok: true,\n                    msg: \"Service \" + serviceName + \" stopped\"\n                }, callback);\n                server.sendStackList();\n            } catch (e) {\n                callbackError(e, callback);\n            }\n        });\n\n        agentSocket.on(\"restartService\", async (stackName: unknown, serviceName: unknown, callback) => {\n            try {\n                checkLogin(socket);\n\n                if (typeof stackName !== \"string\" || typeof serviceName !== \"string\") {\n                    throw new Error(\"Invalid stackName or serviceName\");\n                }\n\n                const stack = await Stack.getStack(server, stackName, true);\n                await stack.restartService(socket, serviceName);\n                callbackResult({\n                    ok: true,\n                    msg: \"Service \" + serviceName + \" restarted\"\n                }, callback);\n            } catch (e) {\n                callbackError(e, callback);\n            }\n        });\n\n        // getExternalNetworkList\n        agentSocket.on(\"getDockerNetworkList\", async (callback) => {\n            try {\n                checkLogin(socket);\n                const dockerNetworkList = await server.getDockerNetworkList();","sourceCodeStart":289,"sourceCodeEnd":325,"githubUrl":"https://github.com/louislam/dockge/blob/f809ae192b571944ad773e9866d3e67064ae8043/backend/agent-socket-handlers/docker-socket-handler.ts#L289-L325","documentation":"Thrown by the 'restartService' handler as a plain Error (not ValidationError, unlike its siblings) when stackName or serviceName is not a string. Same purpose: the handler accepts `unknown` socket payloads and rejects wrong types before touching Docker.","triggerScenarios":"socket.emit('restartService', stackName, serviceName) with a non-string in either slot — undefined service name, null stack reference, numeric id, or object passed by mistake.","commonSituations":"Restart action triggered from a stale UI row after the stack list refreshed; automation calling the socket API with ids; copy-paste of handler arguments in the wrong order.","solutions":["Pass stackName and serviceName as strings, in that order","Guard before emit with typeof checks on both values","Resolve ids/objects to their string names before calling","Keep payload shapes consistent with startService/stopService to avoid drift"],"exampleFix":"// before\nsocket.emit(\"restartService\", stack.id, service, cb);\n// after\nsocket.emit(\"restartService\", stack.name, service.name, cb);","handlingStrategy":"type-guard","validationCode":"function validateRestartArgs(stackName: unknown, serviceName: unknown): boolean {\n  return typeof stackName === \"string\" && typeof serviceName === \"string\";\n}\nif (!validateRestartArgs(stackName, serviceName)) throw new TypeError(\"restartService payload invalid\");","typeGuard":"const isRestartPayload = (s: unknown, n: unknown): s is string => typeof s === \"string\" && typeof n === \"string\";","tryCatchPattern":"socket.emit(\"restartService\", stackName, serviceName, (res) => {\n  if (!res.ok) console.error(\"restartService rejected:\", res.msg);\n});","preventionTips":["Mirror the payload shape used by startService/stopService","Resolve stale UI references after stack list refresh","Validate payload types in a shared emit wrapper"],"tags":["validation","socket-io","typescript","type-error"],"backgroundTag":"invalid-argument-type","analyzedSha":"f809ae192b571944ad773e9866d3e67064ae8043","analyzedAt":"2026-08-31T19:13:50.919Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}