BabylonJS/Babylon.js · error · Error

Object is undefined

Error message

Object is undefined

What it means

FlowGraphJsonPointerParserBlock resolves a JSON Pointer path and stores the final target object in its output. After resolving the pointer, if `getTarget` returns no object (null/undefined), the block throws 'Object is undefined'. It means the pointer could not resolve to a concrete container object at runtime.

Source

Thrown at packages/dev/core/src/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.ts:97

    ) {
        super(RichTypeAny, config);
        this.object = this.registerDataOutput("object", RichTypeAny);
        this.propertyName = this.registerDataOutput("propertyName", RichTypeAny);
        this.setterFunction = this.registerDataOutput("setFunction", RichTypeAny, this._setPropertyValue.bind(this));
        this.getterFunction = this.registerDataOutput("getFunction", RichTypeAny, this._getPropertyValue.bind(this));
        this.generateAnimationsFunction = this.registerDataOutput("generateAnimationsFunction", RichTypeAny, this._getInterpolationAnimationPropertyInfo.bind(this));
        this.templateComponent = new FlowGraphPathConverterComponent(config.jsonPointer, this);
    }

    public override _doOperation(context: FlowGraphContext): P {
        const accessorContainer = this.templateComponent.getAccessor(this.config.pathConverter, context);
        // Pass the context as the accessor payload so context-aware object-model accessors, such as
        // one validating a delay handle against the runtime active-delay set, can resolve.
        const value = accessorContainer.info.get(accessorContainer.object, undefined, context) as P;
        const object = accessorContainer.info.getTarget?.(accessorContainer.object);
        const propertyName = accessorContainer.info.getPropertyName?.[0](accessorContainer.object);
        if (!object) {
            throw new Error("Object is undefined");
        } else {
            this.object.setValue(object, context);
            if (propertyName) {
                this.propertyName.setValue(propertyName, context);
            }
        }
        return value;
    }

    private _setPropertyValue(_target: O, _propertyName: string, value: P, context: FlowGraphContext): void {
        const accessorContainer = this.templateComponent.getAccessor(this.config.pathConverter, context);
        const type = accessorContainer.info.type;
        if (type.startsWith("Color")) {
            value = ToColor(value as Vector4, type) as unknown as P;
        }
        // Unwrap FlowGraphInteger to plain number for numeric setters
        if (typeof (value as any)?.value === "number" && (value as any)?.getClassName?.() === "FlowGraphInteger") {
            value = (value as any).value as unknown as P;

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Verify the JSON Pointer path segments match the actual runtime object shape
  2. Log/inspect the accessor's resolved target and intermediate objects before the block runs
  3. Add a guard or conditional execution so the block only runs when the target exists

Example fix

// before
pointer = '/user/address/city'; // throws if user.address missing
// after
if (data.user?.address) { pointer = '/user/address/city'; }
Defensive patterns

Strategy: validation

Validate before calling

const target = obj && typeof obj === 'object' ? pointerGet(root, pointer) : undefined;
if (target == null) throw new Error('JSON pointer does not resolve: ' + pointer);

Type guard

const isResolvable = (v: unknown): v is Record<string, unknown> => v !== null && typeof v === 'object';

Try / catch

try { block._doOperation(context); } catch (e) { if (e.message === 'Object is undefined') { /* skip or set default */ } else throw e; }

Prevention

When it happens

Trigger: Evaluating a JSON pointer whose intermediate path segment does not exist (e.g. '/foo/bar/baz' when context.obj.foo.bar is undefined), or an accessor whose getTarget returns undefined for the resolved container.

Common situations: Pointers written against a data shape that changed; missing context variables so the path resolves into nothing; typos in pointer segments; accessing optional fields before they are populated.

Related errors


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/a26a50bba6d9d474. Report an issue: GitHub.