我正在尝试使用node.js在Neo4j数据库中创建一些节点和连接。我搞砸了一些教程,并试图对其进行修改。我是Node的菜鸟。在这种情况下,我要解析一组对象以填充数据库。每个对象中都有experiences个数组。我不断收到错误;


  未处理的承诺被拒绝。该错误是由于抛出
  在没有catch块的异步函数内部,或者通过拒绝
  没有用.catch()处理的承诺


我认为该错误与循环experiences.forEach有关。这是一个循环。我不确定该如何克服。

// Create a person node
function addPerson(tx, name) {
  return tx.run("MERGE (a:Person {name: $name})", { name: name });
}

// Create a position node
async function addPosition(tx, name) {
  return tx.run("CREATE (a:Position {name: $name})", { name: name });
}

// Create an employment relationship to a pre-existing Person node.
// This relies on the person first having been created.
function addPositionConnection(tx, personName, positionTitle) {
  return tx.run(
    "MATCH (person:Person {name: $personName}) " + "MATCH (position:Position {name: $positionTitle}) " + "CREATE (person)-[:HAS_POSITION]->(position)",
    {
      personName: personName,
      positionTitle: positionTitle
    }
  );
}

(async function neo4jInsertData() {
  try {
    const profiles = [
      {
        userProfile: {
          fullName: "Test name 1"
        },
        experiences: [
          {
            title: "CEO"
          }
        ]
      },
      {
        userProfile: {
          fullName: "Test name 2"
        },
        experiences: [
          {
            title: "CTO"
          }
        ]
      }
    ];

    for (var x = 0; x < profiles.length; x++) {
      const name = profiles[x].userProfile.fullName;
      const experiences = profiles[x].experiences;

      const session1 = driver.session(neo4j.WRITE);

      const first = session1
        .writeTransaction(tx => addPerson(tx, name))
        .then(tx => {
          try {
            experiences.forEach((tx, experience, index) => {
              addPosition(tx, experience.title).then(() => addPositionConnection(tx, name, experience.title));
            });
          } catch (err) {
            console.log("err", err);
          }
        })
        .then(() => {
          console.log("closing");

          return session1.close();
        });
    }
  } catch (err) {
    console.log("there is an error", err);
  }
})();

最佳答案

您的addPosition函数用async注释,因此addPosition将返回可能被异步拒绝的承诺(例如,如果其tx.run调用引发异常)。

您收到的错误消息是说您的addPosition调用返回的承诺(具有then块)已被拒绝,但是由于承诺没有catch块,因此无法处理拒绝。

解决此问题的一种方法是使用addPosition注释await调用,这会将任何promise拒绝都转换为引发的异常。

10-08 04:45