{"record":{"id":"e87e603da232f0ee","repo":"BabylonJS/Babylon.js","slug":"error-parsing-node-configuration","errorCode":null,"errorMessage":"Error parsing node configuration","messagePattern":"Error parsing node configuration","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts","lineNumber":283,"sourceCode":"            uniqueId: RandomGUID(),\n            className,\n            dataInputs: [],\n            dataOutputs: [],\n            signalInputs: [],\n            signalOutputs: [],\n            config: {},\n            type,\n            metadata: {},\n        };\n    }\n\n    private _parseNodeConfiguration(node: IKHRInteractivity_Node, block: ISerializedFlowGraphBlock, nodeMapping: IGLTFToFlowGraphMapping, blockType: FlowGraphBlockNames | string) {\n        const gltfConfiguration = node.configuration;\n        if (gltfConfiguration) {\n            for (const key in gltfConfiguration) {\n                const gltfProperty = gltfConfiguration[key];\n                if (!gltfProperty) {\n                    throw new Error(\"Error parsing node configuration\");\n                }\n\n                const propertyMapping = nodeMapping.configuration?.[key];\n                const belongsToBlock = propertyMapping && propertyMapping.toBlock ? propertyMapping.toBlock === blockType : nodeMapping.blocks.indexOf(blockType) === 0;\n                if (belongsToBlock) {\n                    let value = propertyMapping?.defaultValue;\n                    if (gltfProperty?.value) {\n                        value = gltfProperty.value;\n                    }\n\n                    if (!propertyMapping?.isArray) {\n                        if (value.length !== 1) {\n                            Logger.Warn(`Invalid non-array value length: ${value.length}`);\n                        }\n\n                        value = value[0];\n                    }\n","sourceCodeStart":265,"sourceCodeEnd":301,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts#L265-L301","documentation":"Thrown in _parseNodeConfiguration when an entry in a node's `configuration` object resolves to a falsy value (null/undefined/empty). Each configuration key must carry a value descriptor; an empty entry cannot be converted into block config and aborts node parsing.","triggerScenarios":"A node's `configuration` object contains a key mapped to null, undefined, or an empty descriptor (e.g. { \"a\": null }) while _parseNodes iterates configuration keys for each block of the node.","commonSituations":"Hand-edited glTF; tool-generated configs where a value was stripped but the key kept; JSON merge patches introducing nulls; exporter bugs emitting empty configuration entries.","solutions":["Remove the empty/null key from the node's `configuration` object","Provide a proper value descriptor { \"type\": <index>, \"value\": [...] } for the key","Check which node failed via surrounding logs and fix that node in the asset","Re-export the asset with a current exporter"],"exampleFix":"// before\n\"configuration\": { \"speed\": null }\n// after\n\"configuration\": { \"speed\": { \"type\": 0, \"value\": [1] } }","handlingStrategy":"validation","validationCode":"for (const node of graph.nodes ?? []) {\n  for (const [key, cfg] of Object.entries(node.configuration ?? {})) {\n    if (!cfg) throw new Error(`Node configuration '${key}' is null/empty`);\n  }\n}","typeGuard":"function hasValidConfiguration(node: IKHRInteractivity_Node): boolean {\n  return !node.configuration || Object.values(node.configuration).every((c) => c != null);\n}","tryCatchPattern":"try {\n  const parser = new InteractivityGraphToFlowGraphParser(graph, gltf);\n} catch (e) {\n  if (e.message === 'Error parsing node configuration') {\n    console.warn('Empty node configuration entry; stripping empty configs and retrying');\n    graph.nodes?.forEach((n) => {\n      for (const k of Object.keys(n.configuration ?? {})) {\n        if (!n.configuration![k]) delete n.configuration![k];\n      }\n    });\n    return new InteractivityGraphToFlowGraphParser(graph, gltf);\n  }\n  throw e;\n}","preventionTips":["Delete empty configuration keys instead of leaving null entries","Sanitize glTF JSON after automated merge/patch steps","Validate node configuration objects against the KHR_interactivity schema","Prefer exporter regeneration over manual configuration edits"],"tags":["gltf","khr-interactivity","configuration","parser"],"backgroundTag":"malformed-node-configuration","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}