node.js - Bolt连接,Docker Compose + Neo4j + Node

标签 node.js docker neo4j

我是 Docker Compose 的新手,我正在尝试让两个镜像(一个是 Node 应用程序,另一个是 Neo4j 数据库)在本地协同工作。我的操作系统是Ubuntu。虽然每个图像单独工作正常,但我无法让 Node 应用程序图像连接到数据库图像。

我几乎可以肯定这与端口连接有关;准确地说,使用我在驱动程序连接中使用的 URL 参数:


    var driver = neo4j.driver("bolt://neo4j:7687", neo4j.auth.basic("tester", "tester"));

其中“7687”是 docker-compose.yml 中 Neo4j 的 Bolt 端口,“neo4j”是我分配给 Neo4j 镜像的名称(见下文)。

我正在关注(使用不同的 JS 驱动程序)我能找到的唯一 Node+Neo4j+Docker 教程 ( https://medium.com/@slavahatnuke/neo4j-node-js-docker-docker-compose-fdc1cc9cf405 ),并且那里的用户评论似乎确认错误位于我的连接 URL 中。

尝试总结一下:

  1. Node 应用程序正在使用官方 neo4j-javascript-driver 通过 Bolt 连接到 Neo4j 数据库。具体代码为:

    "use strict";

    var express = require('express');
    var neo4j = require('neo4j-driver').v1;
    const PORT = 8080;

    var app = express();

    //below is a test of the Neo4j connection, with which I have trouble connecting from in a Docker container

    router.get('/test', function (req, res) {
        var driver = neo4j.driver("bolt://neo4j:7687", neo4j.auth.basic("tester", "tester"));

        var session = driver.session();
        console.log(session);
        var countPromise = session.readTransaction(function(transaction) {
        var result = transaction.run("MATCH (n) RETURN COUNT(n) AS c")
            .then(function(result) {
                console.log(result);
                return result.records[0].get("c");
            });
            return result;
        });
        countPromise.then(function(result) {
            res.json(result);
            session.close();
            driver.close();
        });

    });


    app.listen(PORT);
    console.log("Running on " + PORT);

    module.exports = app;

  • Neo4j 镜像是 Docker 的官方 Neo4j 镜像。

  • 我正在使用以下 docker-compose.yml 文件:

  • nodeapp:
      image: node:latest
      volumes:
       - ./nodeapp:/nodeapp
      links:
       - neo4j
      ports:
       - "18080:8080"
      working_dir: /nodeapp
      entrypoint: node index.js
    
    neo4j:
      image: neo4j
      ports:
       - "17474:7474"
       - "17687:7687"
      volumes:
      - ./db/dbms:/data/dbms
    
  • 当我运行它时(使用“docker-compose up”),我可以:

    A.通过将浏览器指向:“localhost:17474”,可以正常访问 Neo4j 浏览器控制台。我使用提供的用户凭据登录并可以正常运行 Cypher 查询。

    B.如果我不尝试创建 Neo4j 驱动程序,我可以通过将浏览器指向“localhost:18080”来运行 Node 中的任何常规 GET 函数。

    C.输出显示以下内容:“Bolt 在 0.0.0.0:7687 上启用。”

  • 所以我一直专注于 Node 内的连接 URL。

    但它还没有连接。具体来说,根据日志,程序只是不断尝试创建驱动程序,但失败了(它不断重复“这是 Neo4j 连接测试”这一行)。

    我确信 Docker Compose 缺少一些简单的东西。

    在没有 Docker 的情况下,我使用 URL“bolt://localhost:7687”成功将应用程序连接到数据库。现在已经在 Docker 中了,我不知道应该使用什么。

    感谢您的指导。

    更新:

    恐怕这些建议都不起作用。

    这里有一些更多信息:

    1. 当我运行“docker-compose ps”时,我得到了这个,所以看起来端口映射正确。
          Name             Command             State              Ports       
    -------------------------------------------------------------------------
    initialnode_neo4   /docker-           Up                 7473/tcp, 0.0.0. 
    j_1                entrypoint.sh                         0:17474->7474/tc 
                       neo4j                                 p, 0.0.0.0:17687 
                                                             ->7687/tcp       
    initialnode_node   node index.js      Up                 0.0.0.0:18080->8 
    app_1                                                    080/tcp  
    
  • 我在运行时检查了 Neo4j 镜像,以下是一些相关结果:
  • 
         "NetworkMode": "default",
                    "PortBindings": {
                        "7474/tcp": [
                            {
                                "HostIp": "",
                                "HostPort": "17474"
                            }
                        ],
                        "7687/tcp": [
                            {
                                "HostIp": "",
                                "HostPort": "17687"
                            }
                        ]
                    },
    
        ...
        "ExposedPorts": {
                        "7473/tcp": {},
                        "7474/tcp": {},
                        "7687/tcp": {}
                    },
        ...
        "NetworkSettings": {
                    "Bridge": "",
                    "SandboxID": "5eb2b7805cc802391c08be8c85cdbb19fd42de6cc794e76e57f5214c6763c140",
                    "HairpinMode": false,
                    "LinkLocalIPv6Address": "",
                    "LinkLocalIPv6PrefixLen": 0,
                    "Ports": {
                        "7473/tcp": null,
                        "7474/tcp": [
                            {
                                "HostIp": "0.0.0.0",
                                "HostPort": "17474"
                            }
                        ],
                        "7687/tcp": [
                            {
                                "HostIp": "0.0.0.0",
                                "HostPort": "17687"
                            }
                        ]
                    },
    
        ...
    
        "Gateway": "172.17.0.1",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "MacAddress": "02:42:ac:11:00:02",
                    "Networks": {
                        "bridge": {
                            "IPAMConfig": null,
                            "Links": null,
                            "Aliases": null,
                            "NetworkID": "8ffa640b707301bb9b8b6c2a1cfb6f5deac8c1a5f5de9e9de0976697b01027ef",
                            "EndpointID": "941911b65cf0b714fa13ac45ca967478a513fe5c282283aa0bfe20afcc0df06f",
                            "Gateway": "172.17.0.1",
                            "IPAddress": "172.17.0.2",
                            "IPPrefixLen": 16,
                            "IPv6Gateway": "",
                            "GlobalIPv6Address": "",
                            "GlobalIPv6PrefixLen": 0,
                            "MacAddress": "02:42:ac:11:00:02"
                        }
                    }
                }
        ...
    
    
  • 我检查了 Neo4j 问题的日志,并且我一直收到此消息:
  • 
        {"log":"  _writeConnectionHolder: \n","stream":"stdout","time":"2017-05-05T16:20:59.37931736Z"}
        {"log":"   ConnectionHolder {\n","stream":"stdout","time":"2017-05-05T16:20:59.379324034Z"}
        {"log":"     _mode: 'WRITE',\n","stream":"stdout","time":"2017-05-05T16:20:59.379330305Z"}
        {"log":"     _connectionProvider: \n","stream":"stdout","time":"2017-05-05T16:20:59.379353139Z"}
        {"log":"      DirectConnectionProvider {\n","stream":"stdout","time":"2017-05-05T16:20:59.379363823Z"}
        {"log":"        _address: 'neo4j:7687',\n","stream":"stdout","time":"2017-05-05T16:20:59.3793706Z"}
        {"log":"        _connectionPool: [Object],\n","stream":"stdout","time":"2017-05-05T16:20:59.379377162Z"}
        {"log":"        _driverOnErrorCallback: [Function: bound _driverOnErrorCallback] },\n","stream":"stdout","time":"2017-05-05T16:20:59.379384507Z"}
        {"log":"     _referenceCount: 0,\n","stream":"stdout","time":"2017-05-05T16:20:59.379391793Z"}
        {"log":"     _connectionPromise: Promise { null } },\n","stream":"stdout","time":"2017-05-05T16:20:59.379398668Z"}
        {"log":"  _open: true,\n","stream":"stdout","time":"2017-05-05T16:20:59.379405771Z"}
        {"log":"  _hasTx: false,\n","stream":"stdout","time":"2017-05-05T16:20:59.379412739Z"}
        {"log":"  _lastBookmark: undefined,\n","stream":"stdout","time":"2017-05-05T16:20:59.379437046Z"}
        {"log":"  _transactionExecutor: \n","stream":"stdout","time":"2017-05-05T16:20:59.379445641Z"}
        {"log":"   TransactionExecutor {\n","stream":"stdout","time":"2017-05-05T16:20:59.379452547Z"}
        {"log":"     _maxRetryTimeMs: 30000,\n","stream":"stdout","time":"2017-05-05T16:20:59.379459251Z"}
        {"log":"     _initialRetryDelayMs: 1000,\n","stream":"stdout","time":"2017-05-05T16:20:59.379466191Z"}
        {"log":"     _multiplier: 2,\n","stream":"stdout","time":"2017-05-05T16:20:59.379472573Z"}
        {"log":"     _jitterFactor: 0.2,\n","stream":"stdout","time":"2017-05-05T16:20:59.379478888Z"}
        {"log":"     _inFlightTimeoutIds: [] } }\n","stream":"stdout","time":"2017-05-05T16:20:59.379485201Z"}
        {"log":"(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Connection was closed by server\n","stream":"stderr","time":"2017-05-05T16:21:32.301674097Z"}
    
    

    我有一个同事能够连接,但他必须使用一个粗略的第三方库,而且他无法通过 Bolt 连接,只有 7474。

    最佳答案

    看来该问题是由于我的个人计算机设置造成的,这解释了为什么其他人没有遇到此问题。

    除了 Docker Neo4j 镜像之外,我还运行了 Neo4j 的本地版本,并且它们都使用相同的端口。

    这导致连接被拒绝。

    我的案例的解决方案是:

    1. 停止我的本地版本 Neo4j(当我启动计算机时它会自动启动)
    2. 然后使用任何建议的 URL 运行 docker-compose(我只使用“bolt:neo4j:,因为 Docker 镜像自动将 Bolt 映射到 7687)。

    关于node.js - Bolt连接,Docker Compose + Neo4j + Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667574/

    相关文章:

    javascript - 在 npm 安装中找不到 lodash

    node.js - paypal DoExpressCheckout支付方式

    ubuntu - 如何在 Ubuntu 中使用自定义参数自动启动 docker 守护进程?

    docker - 使用 ansible 的 helm 扩展覆盖 values.yml

    javascript - Cypher Neo4j 中 MERGE 和 CREATE 的区别

    javascript - 我可以在单个查询中使用约束和索引将 csv 加载到 neo4j 吗?

    neo4j - "The client is unauthorized due to authentication failure"

    node.js - 如何将 Node.js 与 Jemalloc 一起使用?

    javascript - 测量通过 net.server 生成的 Node.js 总入站/出站流量

    windows - Windows 上的 docker-compose - 容器命令 'sh' 未找到或不存在