neo4j为JavaScript提供的示例脚本赢得';跑不动

neo4j为JavaScript提供的示例脚本赢得';跑不动,javascript,node.js,neo4j,cypher,Javascript,Node.js,Neo4j,Cypher,我是graph数据库生态系统的新手,一开始我正在尝试neo4j。我非常愿意与node和neo4j合作。因此,在快速搜索后,我发现这是一个官方支持的JavaScript驱动程序,并提供了一个示例: const neo4j = require('neo4j-driver') const driver = neo4j.driver(uri, neo4j.auth.basic(user, password)) const session = driver.session() const personN

我是graph数据库生态系统的新手,一开始我正在尝试neo4j。我非常愿意与node和neo4j合作。因此,在快速搜索后,我发现这是一个官方支持的JavaScript驱动程序,并提供了一个示例:

const neo4j = require('neo4j-driver')

const driver = neo4j.driver(uri, neo4j.auth.basic(user, password))
const session = driver.session()
const personName = 'Alice'

try {
  const result = await session.run(
    'CREATE (a:Person {name: $name}) RETURN a',
    { name: personName }
  )

  const singleRecord = result.records[0]
  const node = singleRecord.get(0)

  console.log(node.properties.name)
} finally {
  await session.close()
}

// on application exit:
await driver.close()
现在,当我运行此代码时,立即出现以下错误:

SyntaxError: await is only valid in async function
现在我想我理解了这个错误,我必须用匿名异步函数包装try-catch块来消除这个错误。更改后的代码正文为:

const config = {
    "neo4j": {
        "url": "neo4j://localhost",
        "authUser": "neo4j",
        "authKey": "adminPassword"
    }
}

const neo4j = require("neo4j-driver");

const driver = neo4j.driver(
    config.neo4j.url,
    neo4j.auth.basic(config.neo4j.authUser, config.neo4j.authKey)
);

const session = driver.session();

(async () => {
    try {
        const result = await session.run('CREATE (a:Person {name: $name}) RETURN a', { name: 'Alice' });

        const singleRecord = result.records[0];
        const node = singleRecord.get(0);

        console.log(node.properties.name);
    } catch (error) {
        console.log("Error Body: ", error);
    } finally {
        await session.close();
    }
})();

await driver.close();
但令我沮丧的是,我遇到了另一个非常神秘的错误:

{ Neo4jError: Could not perform discovery. No routing servers available. Known routing table: RoutingTable[database=Sample database, expirationTime=0, currentTime=1592397056399, routers=[], readers=[], writers=[]]

    at captureStacktrace (/Users/pc/node_modules/neo4j-driver/lib/result.js:263:15)
    at new Result (/Users/pc/node_modules/neo4j-driver/lib/result.js:68:19)
    at Session._run (/Users/pc/node_modules/neo4j-driver/lib/session.js:174:14)
    at Session.run (/Users/pc/node_modules/neo4j-driver/lib/session.js:135:19)
    at /Users/pc/neoNode.js:20:38
    at Object.<anonymous> (/Users/pc/neoNode.js:31:3)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12) code: 'ServiceUnavailable', name: 'Neo4jError' }
{Neo4jError:无法执行发现。没有可用的路由服务器。已知路由表:RoutingTable[database=Sample database,expirationTime=0,currentTime=1592397056399,routers=[],readers=[],Writer=[]
在captureStacktrace(/Users/pc/node_modules/neo4j driver/lib/result.js:263:15)
在新结果中(/Users/pc/node_modules/neo4j driver/lib/Result.js:68:19)
在会话中运行(/Users/pc/node\u modules/neo4j driver/lib/Session.js:174:14)
在Session.run(/Users/pc/node_modules/neo4j driver/lib/Session.js:135:19)
at/Users/pc/neoNode.js:20:38
at对象。(/Users/pc/neoNode.js:31:3)
编译(Module.js:653:30)
在Object.Module.\u extensions..js(Module.js:664:10)
在Module.load(Module.js:566:32)
在tryModuleLoad(module.js:506:12)处,代码为:“ServiceUnavailable”,名称为:“Neo4jError”}

首先,我认为您的URL应该是“URL”:bolt://localhost:7687“ 您仍然在异步函数外部使用
wait driver.close()


如果您开始使用neo4j,请寻找OGM(对象图模型)来帮助您。

我在这方面也遇到了一些问题

首先,纳塔姆·奥利维拉是正确的。您需要使用
bolt
协议,等待承诺需要在
async
函数中。出于某种原因,文档中的一些示例中使用了
neo4j
协议。此外,如果您在某种未指定的环境之外使用Neo4j当前在驱动程序手册和javascript驱动程序部分中提供的两个示例,则它们似乎都会导致错误

不过,在npmjs的页面上有一些线索,所以通过将它们应用到现有代码中,我至少能够吐出一些数据。不过,我还想知道如何在
async
函数中实现这一点,因此非常欢迎您解释如何使用此驱动程序

以下是对我有效的方法:

const neo4j = require('neo4j-driver')

const cnx = {
    user: 'neo4j',
    password: 'some passphrase',
    uri: 'bolt://localhost:7687'
}

const driver = neo4j.driver(cnx.uri, neo4j.auth.basic(cnx.user, cnx.password))

driver.verifyConnectivity()
    .then((cnxMsg) => {
        console.log(cnxMsg)
    })

const session = driver.session({ database: 'neo4j' })

session.run('MATCH (n:Movie) RETURN n LIMIT 5')
    .subscribe({
        onKeys: keys => {
            console.log(keys)
        },
        onNext: record => {
            console.log(record.get('n').properties.title)
        },
        onCompleted: () => {
            session.close()
        },
        onError: error => {
            console.error(error) 
        }
    })
这将使用NPM文档中的流式API发布一些电影。(注意:只有在您启动/安装了电影数据库时,它才会起作用,因此请仔细检查您是否删除了它,因为它的删除也是Neo4j教程的一部分。)现在只需将
MATCH
Cypher查询更改为您喜欢的任何查询,并处理输出,例如通过管道将其转换为Express即可

资料来源:


如何将其放入异步函数中以使其工作?异步函数run(){await someFunction();restOfCode…};run()在这个实例中显然不起作用。你能用有效的解决方案更新你的答案吗?谢谢你的回复。您所指的问题实际上在我的代码中。后来我确实使用了“螺栓”协议。我只使用了async/await语法,因为我在示例脚本中看到了它。然后我选择了更熟悉的promise订阅语法。最后一切都解决了。但所有这些都不是问题的唯一原因。Neo4j无法执行任何发现,这让我觉得我可能在数据库中做了一些错误的事情。所以我创建了一个新的,并提供了默认密码和用户。成功了!