使用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;
}
}
答案 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构造函数完成。