{"record":{"id":"0c3cca5a07ad6a2e","repo":"babalae/better-genshin-impact","slug":"javascript-output-0c3cca","errorCode":null,"errorMessage":"JavaScript的Output输出不是布尔类型","messagePattern":"JavaScript的Output输出不是布尔类型","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs","lineNumber":490,"sourceCode":"            }\n        });\n        try\n        {\n            // 传入输入参数\n            engine.Script.ArtifactStat = artifact;\n\n            // 执行JavaScript代码\n            await Task.Run(() => engine.Execute(javaScript));\n\n            // 检查是否有输出\n            if (!engine.Script.propertyIsEnumerable(\"Output\"))\n            {\n                throw new InvalidOperationException(\"JavaScript没有设置Output输出\");\n            }\n\n            if (engine.Script.Output is not bool)\n            {\n                throw new InvalidOperationException(\"JavaScript的Output输出不是布尔类型\");\n            }\n\n            return (bool)engine.Script.Output;\n        }\n        catch (ScriptInterruptedException)\n        {\n            logger.LogWarning(\"脚本执行超出3秒限制，请使用正确的JS代码（JavaScript execution timeout!）\");\n            throw;\n        }\n        catch (ScriptEngineException ex)\n        {\n            throw new Exception($\"JavaScript execution error: {ex.Message}\", ex);\n        }\n    }\n\n    public static bool IsMatchRegularExpression(string affixes, string regularExpression, out string msg)\n    {\n        Match match = Regex.Match(affixes, regularExpression);","sourceCodeStart":472,"sourceCodeEnd":508,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs#L472-L508","documentation":"Thrown by IsMatchJavaScript when engine.Script.Output exists but 'is not bool' — i.e. Output was set to a number, string, object, or undefined. The contract requires Output to be a JavaScript boolean because the method returns (bool)engine.Script.Output.","triggerScenarios":"JS set 'Output = 1' / 'Output = \"true\"' / 'Output = {}' / 'Output = result' where result is not a boolean; comparison used '==' against a non-boolean yielding a number; Output assigned from a function that returns undefined.","commonSituations":"User JS returns a truthy non-bool; JS ported from a language where 0/1 are booleans; missing return statement in the deciding function.","solutions":["Make Output a real boolean: 'Output = !!result;' or ensure the comparison yields true/false.","Return explicitly: 'Output = (a.level >= 20);'.","If using a function, ensure every branch returns a boolean.","Validate the JS returns boolean in a sandbox before deploying."],"exampleFix":"// before\nOutput = (artifact.level >= 20) ? 1 : 0;\n// after\nOutput = artifact.level >= 20;","handlingStrategy":"validation","validationCode":"bool OutputIsBooleanShape(string js) =>\n    Regex.IsMatch(js, @\"Output\\s*=\\s*(true|false|!!|===|!==|>=|<=|>|<|&&|\\|\\|)\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Force a boolean: 'Output = !!expr;'.","Reject numeric/string Output in the JS contract documentation.","Test the JS returns boolean against sample ArtifactStat inputs."],"tags":["game-task","javascript","clearscript","type-mismatch"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}