首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >neo4j为JavaScript提供的示例脚本无法运行

neo4j为JavaScript提供的示例脚本无法运行
EN

Stack Overflow用户
提问于 2020-06-17 20:37:57
回答 2查看 720关注 0票数 1

我对图形数据库生态系统非常陌生,首先我正在试验neo4j。我非常想使用node和neo4j。因此,经过快速搜索,我找到了JavaScript官方支持的驱动程序neo4j-driver,并提供了一个示例:

代码语言: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()

现在,当我运行这段代码时,我立即得到以下错误:

代码语言:javascript
复制
SyntaxError: await is only valid in async function

现在我想我已经理解了这个错误,我必须用匿名异步函数包装try-catch块来消除这个错误。修改后的代码体为:

代码语言:javascript
复制
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();

但令我沮丧的是,我遇到了另一个非常隐秘的错误:

代码语言:javascript
复制
{ 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' }
EN

回答 2

Stack Overflow用户

发布于 2020-07-16 07:28:46

我在这方面也有一些问题。

首先,Natam Oliveira是正确的。您需要使用bolt协议,并且await promises需要在async函数中。由于某些原因,文档中的一些示例中使用了neo4j协议。此外,Neo4j目前提供的两个示例-在driver-manual和javascript-driver部分-似乎都会导致错误,如果您在某种未指定的环境之外使用它们的话。

不过,在npmjs页面上有一些线索,所以通过将它们放入现有代码中,我至少能够输出一些数据。不过,我也想知道如何在async函数中实现这一点,所以如果能解释一下如何在这个驱动程序中工作,那将是非常受欢迎的。

以下是对我有效的方法:

代码语言:javascript
复制
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。

资料来源:

票数 2
EN

Stack Overflow用户

发布于 2020-06-22 20:55:35

首先,我认为你的网址应该是"url": "bolt://localhost:7687",并且你仍然使用异步函数之外的await driver.close()

如果你开始使用neo4j,寻找一个对象图模型(Object Graph Model)来帮助你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62429196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档