0

我想将 n 个密码查询传递给 neo4j 事务,我正在考虑一个好方法。

目前,我有一种采用数组项的工作方法,或者如果它不可用,则使用虚拟查询。(代码如下)

我相信这不是最佳实践。有人知道或知道如何做得更好吗?

    function Neo4jTransaction(QueryArray) {
        const session = driverWrite.session();
        const tx = session.beginTransaction();
        tx.run(QueryArray[0] || "RETURN 0")
        tx.run(QueryArray[1] || "RETURN 0")
        tx.run(QueryArray[2] || "RETURN 0")
        tx.run(QueryArray[3] || "RETURN 0")
        .then(result => {
            return tx.commit()
        }).then(() => {
            session.close()
            driverWrite.close()
        }).catch(exception => {
            console.log(exception)
            session.close()
            driverWrite.close()
        })
    }
4

1 回答 1

0

首先,如果你有一个数组,你可能想要遍历它。其次,tx.run()返回一个 Promise,如果它失败了,你需要捕获它。在您的代码中,它连续调用 4 次,但只有最后一个等待结果并捕获错误。我看起来好像缺少一些代码行。

neo4j-driver 文档为显式事务提供了一个很好的示例:https ://github.com/neo4j/neo4j-javascript-driver#explicit-transactions

查询按顺序执行。如果一个失败,整个事务将被回滚。

async function neo4jTransaction(queryArray) {

  const session = driver.session();

  const txc = session.beginTransaction();

  try {

    for (const query of queryArray) {
      await txc.run(query || 'RETURN 0');
    }

    await txc.commit();

  } catch (e) {

    await txc.rollback();
    return Promise.reject(e);

  } finally {

    await session.close();

  }

}
于 2021-08-05T11:46:30.347 回答