查询不能直接在具有开放事务的会话上运行;从事务内运行或使用不同的会话

Rap*_*ima 6 javascript neo4j node.js

我是 Neo4J 的新手,今天遇到了这个错误,在我的构想中,我正在关闭和打开会话,但是我收到了这个错误。

\n

我只是想知道是否已经有一个节点包含请求中收到的电子邮件,如果是,则不注册,如果没有,则正常注册。

\n

有谁知道我哪里出错了,我又是 Neo4j 的门外汉

\n

提前致谢

\n
exports.createUser = (req, res) => {\n\nconst userName = req.body.name;\nconst userEmail = req.body.email;\nconst userPassword = req.body.password;\n\nconst alreadyRegistered = \n    session.run(\n        `MATCH (n { email: '${userEmail}' })\n        RETURN n`\n    );\nalreadyRegistered.then(result => {\n    session.close();\n    if(result.records.length){\n        res.send('J\xc3\xa1 existi um usu\xc3\xa1rio com este e-mail cadastrado');\n    }\n});\n\nconst create =\n    session.run(\n        `CREATE (n:User {name: '${userName}', email: '${userEmail}', password: '${userPassword}'})\n        RETURN n`\n    );\n\n    create.then(result => {\n    session.close();\n  \n    const singleRecord = result.records[0];\n    const node = singleRecord.get(0);\n  \n    res.send(`Usu\xc3\xa1rio ${userName} cadastrado com sucesso`)\n\n    driver.close();\n});\n};\n
Run Code Online (Sandbox Code Playgroud)\n

Swa*_*yam 4

会话是轻量级对象,专为一次运行单个查询而设计。

\n

我猜你在检查createUser后就打电话了alreadyRegistered。由于这些是异步调用,您会无意中在同一会话中同时执行两个查询。

\n

要解决此问题,如果您不能保证/不希望串行执行查询,则需要为数据库中运行的每个新查询创建一个新会话:

\n
const session = this.driver.session();\nconst results = session.run(/*...*/);\n\nresults.then(async results => {\n            session.close();\n            /*...*/\n    })\n\n
Run Code Online (Sandbox Code Playgroud)\n

此处的 api 对此进行了解释: https: //github.com/neo4j/neo4j-javascript-driver/commit/a6ed396a31c4c2e6420218792172fc5535b8e4e1

\n

相关问题:https://github.com/neo4j/neo4j-javascript-driver/issues/306#issuecomment-366931341

\n

另外,请确保在对 进行查询之前等待alreadyRegistered查询完成createUser。使用 async/await 比.then到处链接更容易:

\n
const result = await alreadyRegistered();\nif(result.records.length){\n    res.send(\'J\xc3\xa1 existi um usu\xc3\xa1rio com este e-mail cadastrado\');\n}\n\nconst user = await createUser();\n
Run Code Online (Sandbox Code Playgroud)\n