我正在尝试使用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拒绝都转换为引发的异常。