“在建立安全TLS连接之前断开客户端网络套接字的连接”-Neo4j / GraphQL

时间:2020-04-23 08:26:18

标签: neo4j graphql nestjs

使用yarn start:dev使用await app.listen(3200);启动NestJS和GraphQL。尝试连接到Neo4J Desktop时,尝试在localhost:3200/graphQL处获取查询时出现此错误:

 "errors": [
   {
     "message": "Client network socket disconnected before secure TLS connection was established",
     "locations": [
       {
         "line": 2,
         "column": 3
       }
     ],
     "path": [
       "getMovies"
     ],
     "extensions": {
       "code": "INTERNAL_SERVER_ERROR",
       "exception": {
         "code": "ServiceUnavailable",
         "name": "Neo4jError"
       }
     }
   }
 ],
 "data": null
}

所以我发现我的本地Neo4J桌面图无法正常运行,但似乎找不到解决该问题的答案。。目前,我有一个config.ts文件,其内容为:

export const HOSTNAME = 'localhost';
export const NEO4J_USER = 'neo4j';
export const NEO4J_PASSWORD = '123';

和文件neogql.resolver.ts

import {
  Resolver,
  Query,
  Args,
  ResolveProperty,
  Parent,
} from '@nestjs/graphql';
import { HOSTNAME, NEO4J_USER, NEO4J_PASSWORD } from '../config';
import { Movie } from '../graphql';
import { Connection, relation, node } from 'cypher-query-builder';
import { NotFoundException } from '@nestjs/common';
const db = new Connection(`bolt://${HOSTNAME}`, {
  username: NEO4J_USER,
  password: NEO4J_PASSWORD,
});
@Resolver('Movie')
export class NeogqlResolver {
  @Query()
  async getMovies(): Promise<Movie> {
    const movies = (await db
      .matchNode('movies', 'Movie')
      .return([
        {
          movies: [{ id: 'id', title: 'title', year: 'year' }],
        },
      ])
      .run()) as any;
return movies;
  }
@Query('movie')
  async getMovieById(
    @Args('id')
    id: string,
  ): Promise<any> {
    const movie = (await db
      .matchNode('movie', 'Movie')
      .where({ 'movie.id': id })
      .return([
        {
          movie: [{ id: 'id', title: 'title', year: 'year' }],
        },
      ])
      .run<any>()) as any;
if (movie.length === 0) {
      throw new NotFoundException(
        `Movie id '${id}' does not exist in database `,
      );
    }
return movie[0];
  }
@ResolveProperty()
  async actors(@Parent() movie: any) {
    const { id } = movie;
return (await db
      .match([node('actors', 'Actor'), relation('in'), node('movie', 'Movie')])
      .where({ 'movie.id': id })
      .return([
        {
          actors: [
            {
              id: 'id',
              name: 'name',
              born: 'born',
            },
          ],
        },
      ])
      .run()) as any;
  }
}

2 个答案:

答案 0 :(得分:2)

确保像这样传递Config对象:

var hostname = this.configService.get<string>('NEO4J_URL');
var username = this.configService.get<string>('NEO4J_USERNAME');
var password = this.configService.get<string>('NEO4J_PASSWORD');

db = new Connection(`${hostname}`, {
        username: username,
        password: password,
    }, { 
        driverConfig: { encrypted: "ENCRYPTION_OFF" }
    });

答案 1 :(得分:1)

在neo4j版本4服务器上运行时,grandSTACK也有相同的问题。根据威尔·里昂(Will Lyon)的说法,这是由于驱动程序和数据库之间的默认加密不匹配:https://community.neo4j.com/t/migrating-an-old-grandstack-project-to-neo4j-4/16911/2

因此使用传递配置对象

{ encrypted: "ENCRYPTION_OFF"}

应该由Connection构造函数完成。

相关问题