开发者问题收集

在 SigmaJs 中我收到“未捕获的类型错误:无法读取未定义的属性(读取‘进程’)”错误

2022-03-30
1036

我从官方 SigmaJs github repo 上的演示项目开始: https://github.com/jacomyal/sigma.js 错误如下:

Uncaught TypeError: Cannot read properties of undefined (reading 'process') sigma.js:626
at Sigma.process (sigma.js:626:1)
at Sigma._refresh (sigma.js:704:1)
at sigma.js:726:1

我可以在浏览器的控制台中看到它,该解决方案使用“npm start”编译得很好。

我正在尝试使用 SigmaJs 创建一个解决方案,它可以从 Neo4j 数据库加载数据,然后呈现节点和边。我能够从数据库中获取数据,并以能够处理的形式对其进行解析。图形对象获取所有节点和边。在 UI 上,集群和标签与我的交换。到目前为止,唯一不起作用的事情(在我看来)是节点未显示。

由于某种原因,它们在某处获取了 true 的隐藏值。

节点也有标签和标记,但这些都是敏感数据。

我无法弄清楚。在 SigmaJs/demo/src/views/Root.tsx 中有一部分我不知道如何更改,或者更确切地说不知道要更改什么。我没有使用图像,但无论有没有这行代码,我都会得到同样的错误:

<div id="app-root" className={showContents ? "show-contents" : ""}>
      <SigmaContainer
        graphOptions={{ type: "directed" }}
        initialSettings={{
          nodeProgramClasses: { image: getNodeProgramImage() }, <----------------
          labelRenderer: drawLabel,
          defaultNodeType: "image", <-------- This line i got rid of.
          defaultEdgeType: "arrow",
          labelDensity: 0.07,
          labelGridCellSize: 60,
          labelRenderedSizeThreshold: 15,
          labelFont: "Lato, sans-serif",
          zIndex: true,
        }}
        className="react-sigma"
      >
        <GraphSettingsController hoveredNode={hoveredNode} />
        <GraphEventsController setHoveredNode={setHoveredNode} />
        <GraphDataController dataset={dataset} filters={filtersState} />
        {dataReady && (
          <>
            <div className="controls">
              <div className="ico">
                <button
                  type="button"
                  className="show-contents"
                  onClick={() => setShowContents(true)}
                  title="Show caption and description"
                >
                  <BiBookContent />
                </button>
              </div>
              <FullScreenControl
                className="ico"
                customEnterFullScreen={<BsArrowsFullscreen />}
                customExitFullScreen={<BsFullscreenExit />}
              />
              <ZoomControl
                className="ico"
                customZoomIn={<BsZoomIn />}
                customZoomOut={<BsZoomOut />}
                customZoomCenter={<BiRadioCircleMarked />}
              />
            </div>
            <div className="contents">
              <div className="ico">
                <button
                  type="button"
                  className="ico hide-contents"
                  onClick={() => setShowContents(false)}
                  title="Show caption and description"
                >
                  <GrClose />
                </button>
              </div>
              <GraphTitle filters={filtersState} />
              <div className="panels">
                <SearchField filters={filtersState} />
                <DescriptionPanel />
                <ClustersPanel
                  clusters={dataset.clusters}
                  filters={filtersState}
                  setClusters={(clusters) =>
                    setFiltersState((filters) => ({
                      ...filters,
                      clusters,
                    }))
                  }
                  toggleCluster={(cluster) => {
                    setFiltersState((filters) => ({
                      ...filters,
                      clusters: filters.clusters[cluster]
                        ? omit(filters.clusters, cluster)
                        : { ...filters.clusters, [cluster]: true },
                    }));
                  }}
                />
                <TagsPanel
                  tags={dataset.tags}
                  filters={filtersState}
                  setTags={(tags) =>
                    setFiltersState((filters) => ({
                      ...filters,
                      tags,
                    }))
                  }
                  toggleTag={(tag) => {
                    setFiltersState((filters) => ({
                      ...filters,
                      tags: filters.tags[tag] ? omit(filters.tags, tag) : { ...filters.tags, [tag]: true },
                    }));
                  }}
                />
              </div>
            </div>
          </>
        )}
      </SigmaContainer>
    </div>
2个回答

谢谢 Tomaž Bratanič!! 在对评论部分中的存储库进行一些调查后,我发现了我的问题。
节点未显示,因为它们具有隐藏值 true。这种情况发生在 https://github.com/jacomyal/sigma.js/blob/main/demo/src/views/GraphDataController.tsx

graph.forEachNode((node, { cluster, tag }) =>
      graph.setNodeAttribute(node, "hidden", ---> !clusters[cluster] || !tags[tag]), <---
    );

箭头之间的部分负责此值。在我的情况下,节点所具有的群集是一个列表,因此我必须为其实现一个函数,如下所示:

function isTagHidden(id: string): boolean {
    let ishidden = false;
    const { tags } = filters; <-- containts records of clusters and tags
    let node = graph.getNodeAttributes(id);
    node.tags.forEach((key: string) => {
      if (tags[key]) {
        ishidden = true;
      }
    });
    return ishidden;
  }

群集的另一个类似函数。

至于标题提到的主要问题,它是简单的代码错误。在 root 文件中,有一个启动动画的变量。

if (!dataset) return null;    
requestAnimationFrame(() => setDataReady(true));

我正在使用异步方法,因此我把这一行放在哪里很重要,否则我给出的是一个空数据集,难怪它是未定义的。所以我在检查后放置它,一切正常!

我希望我说清楚了,这对您使用 sigma.js 有所帮助。

Attila Bacskai
2022-04-05

如果您的节点指定了 type ,但未能在 Sigma 配置中为该类型实现 nodeProgramClasses ,也会发生这种情况。

例如:

graph.addNode("Sushis", { size: 7, label: "Sushis", type: "border", color: GREEN });

renderer = new Sigma(this.graph, this.domNode, {
  nodeProgramClasses: {
    image: getNodeProgramImage(),
    // by commenting this out, the error will be thrown
//  border: NodeProgramBorder, 
  },
});

我提交了一个 PR,以便在用户犯此错误时向他们发出警告: https://github.com/jacomyal/sigma.js/pull/1248

Seph Reed
2022-05-21