BabylonJS/Babylon.js · error · Error

Failed to find node '${name}'

Error message

Failed to find node '${name}'

What it means

glTFLoader's importMeshAsync resolves mesh names to loader nodes via an internal nodeMap. When a requested name is not present in that map, it throws this error, indicating the glTF asset contains no node with that exact name.

Source

Thrown at packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts:424

            this._loadData(data);

            let nodes: Nullable<Array<number>> = null;

            if (meshesNames) {
                const nodeMap: { [name: string]: number } = {};
                if (this._gltf.nodes) {
                    for (const node of this._gltf.nodes) {
                        if (node.name) {
                            nodeMap[node.name] = node.index;
                        }
                    }
                }

                const names = meshesNames instanceof Array ? meshesNames : [meshesNames];
                nodes = names.map((name) => {
                    const node = nodeMap[name];
                    if (node === undefined) {
                        throw new Error(`Failed to find node '${name}'`);
                    }

                    return node;
                });
            }

            return await this._loadAsync(rootUrl, fileName, nodes, () => {
                return {
                    meshes: this._getMeshes(),
                    particleSystems: [],
                    skeletons: this._getSkeletons(),
                    animationGroups: this._getAnimationGroups(),
                    lights: this._babylonLights,
                    transformNodes: this._getTransformNodes(),
                    geometries: this._getGeometries(),
                    spriteManagers: [],
                };
            });

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Verify the exact node names in the glTF JSON (check the 'nodes' array 'name' fields) and correct the meshesNames argument
  2. Pass node indices (numbers) instead of names to avoid name-matching issues entirely
  3. Pass null as meshesNames to import all meshes when specific names are not required
  4. Log Object.keys of parsed asset nodes or inspect the file with a glTF validator to confirm names

Example fix

// before
loader.importMeshAsync(["Ship_Hull"], scene, "model.glb", rootUrl);
// after
loader.importMeshAsync(["ShipHull"], scene, "model.glb", rootUrl); // name must match the glTF node 'name' exactly
Defensive patterns

Strategy: validation

Validate before calling

// Pre-fetch and check the glTF JSON before importMeshAsync
const res = await fetch(url);
const gltf = await res.json();
const nodeNames = new Set((gltf.nodes ?? []).map(n => n.name).filter(Boolean));
const requested = Array.isArray(meshesNames) ? meshesNames : [meshesNames];
const missing = requested.filter(n => !nodeNames.has(n));
if (missing.length) throw new Error(`glTF nodes not found: ${missing.join(", ")}`);

Type guard

function hasAllNodes(gltf, names) {
  const nodeNames = new Set((gltf.nodes ?? []).map(n => n.name).filter(Boolean));
  return names.every(n => nodeNames.has(n));
}

Try / catch

try {
  await loader.importMeshAsync(names, scene, url, rootUrl);
} catch (e) {
  if (e.message.startsWith("Failed to find node")) {
    console.warn(`Skipping asset, unknown node: ${e.message}`);
  } else throw e;
}

Prevention

When it happens

Trigger: Calling loader.importMeshAsync with meshesNames (a string or array of strings) where one or more names do not match any node in the glTF's 'nodes' array.

Common situations: Typos or case-mismatched node names; referencing a mesh name instead of a node name (glTF nodes vs meshes are distinct); the asset was exported with different node names than expected; passing names from a different glTF file.

Related errors


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