1

您好,我在 Angular 2 CLI 应用程序中尝试使用 Neo4j 驱动程序时遇到了一些未找到模块的错误。

我可能会遗漏一些试图导入它的东西。

  • 我安装它:ng install neo4j-driver
  • 在我的 service.ts 中:import 'neo4j-driver/lib/browser/neo4j-web';
  • 尝试在服务中调用此示例代码:

    getFromDB(): void {
       var neo4j = require('neo4j-driver').v1;
       var driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "pisikopat"));
    
       // Create a session to run Cypher statements in.
       // Note: Always make sure to close sessions when you are done using them!
       var session = driver.session();
    
       // Run a Cypher statement, reading the result in a streaming manner as records arrive:
       session
         .run("OPTIONAL MATCH (source)-[r]-(target) WHERE r is not null RETURN (source)")
         .subscribe({
           onNext: function (record) {
             console.log(record._fields);
           },
           onCompleted: function () {
             // Completed!
             session.close();
           },
           onError: function (error) {
             console.log(error);
           }
         });
     }
    

当我我的应用程序提供服务时,我收到以下错误:

ERROR in ./~/neo4j-driver/lib/v1/internal/ch-node.js
Module not found: Error: Can't resolve 'net' in 'E:\emek\node_modules\neo4j-driver\lib\v1\internal'
 @ ./~/neo4j-driver/lib/v1/internal/ch-node.js 32:11-25 364:2-24
 @ ./~/neo4j-driver/lib/v1/internal/connector.js
 @ ./~/neo4j-driver/lib/v1/driver.js
 @ ./~/neo4j-driver/lib/v1/index.js
 @ ./~/neo4j-driver/lib/index.js
 @ ./src/app/services/heroes.service.ts
 @ ./src/app/app.component.ts
 @ ./src/app/index.ts
 @ ./src/main.ts
 @ multi main

ERROR in ./~/neo4j-driver/lib/v1/internal/ch-node.js
Module not found: Error: Can't resolve 'tls' in 'E:\emek\node_modules\neo4j-driver\lib\v1\internal'
 @ ./~/neo4j-driver/lib/v1/internal/ch-node.js 36:11-25
 @ ./~/neo4j-driver/lib/v1/internal/connector.js
 @ ./~/neo4j-driver/lib/v1/driver.js
 @ ./~/neo4j-driver/lib/v1/index.js
 @ ./~/neo4j-driver/lib/index.js
 @ ./src/app/services/heroes.service.ts
 @ ./src/app/app.component.ts
 @ ./src/app/index.ts
 @ ./src/main.ts
 @ multi main

ERROR in ./~/neo4j-driver/lib/v1/internal/ch-node.js
Module not found: Error: Can't resolve 'readline' in 'E:\emek\node_modules\neo4j-driver\lib\v1\internal'
 @ ./~/neo4j-driver/lib/v1/internal/ch-node.js 92:2-21
 @ ./~/neo4j-driver/lib/v1/internal/connector.js
 @ ./~/neo4j-driver/lib/v1/driver.js
 @ ./~/neo4j-driver/lib/v1/index.js
 @ ./~/neo4j-driver/lib/index.js
 @ ./src/app/services/heroes.service.ts
 @ ./src/app/app.component.ts
 @ ./src/app/index.ts
 @ ./src/main.ts
 @ multi main

角度-cli:1.0.0-beta.15 节点:4.5.0 操作系统:win32 x64

4

1 回答 1

1

这可能有点晚了,但无论如何都是这样。

首先,您需要更改导入和分配驱动程序的方式。改变:

import 'neo4j-driver/lib/browser/neo4j-web';

至:

import * as neo4j_driver from 'neo4j-driver/lib/browser/neo4j-web.min.js';

然后更改节点查找语法:

var neo4j = require('neo4j-driver').v1;

至:

const neo4j = neo4j_driver.v1;

这将摆脱您遇到的错误。

然后,您实际上可能会因为未在 uri 中分配端口而收到错误。为了获得正确的端口(7474 对我不起作用),我启动了数据库并在 localhost:7474 访问了 Neo4j 浏览器。然后,您必须查看显示“您作为用户 neo4j 连接到服务器 bolt://localhost:7687”的页面,我不确定这是默认设置还是已分配,但无论如何。

然后,我在我的 uri 中使用了该端口,现在一切都在 Angular 中工作(尽管如果使用远程连接(例如 Graphene)并且我能找到的唯一文档不适用于 JS 驱动程序,我无法让它工作)。

这是我的完整解决方案:

import {Component, OnInit} from '@angular/core';
import * as neo4j_driver from 'neo4j-driver/lib/browser/neo4j-web.min.js';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'app works!';

  constructor() {
  }

  ngOnInit() {
    const neo4j = neo4j_driver.v1;
    const uri = 'bolt://localhost:7687';
    const user = 'neo4j';
    const password = '<your password>';
    const driver = neo4j.driver(uri, neo4j.auth.basic(user, password), {maxTransactionRetryTime: 15000});

    // Register a callback to know if driver creation was successful:
    driver.onCompleted = function () {
    // proceed with using the driver, it was successfully instantiated
    };
    // Register a callback to know if driver creation failed.
    // This could happen due to wrong credentials or database unavailability:
    driver.onError = function (error) {
      console.log('Driver instantiation failed', error);
    };

    const session = driver.session();
    const result = session.run('MATCH (a:Person) RETURN a.name ORDER BY a.name');
    const people = [];

    result.subscribe({
      onNext: record => {
        const name = record.get(0);
        people.push(name);
      },
      onCompleted: () => {
        session.close();
        console.log(people);
      },
      onError: error => {
        console.log(error);
      }
    });
  }
}
于 2017-05-18T22:10:46.917 回答