Ошибка: неизвестная директива "отношение". с гранд-стеком neo4j - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь запустить grand-stack-starter из neo4j и получаю приведенную ниже ошибку с модулем API после того, как я выполню всю часть схемы graphql. он жалуется, что директива «связь» и «шифр» неизвестны. Я переустановил neo4j-graphql-js, но не решил проблему. Ниже приведено сообщение об ошибке

grand-stack-starter-api@0.0.1 start C:\Users\grand-stack-starter-master\api
nodemon --exec babel-node src/index.js

[nodemon] 1.18.9
[nodemon] to restart at any time, enter rs
[nodemon] watching: .
[nodemon] starting babel-node src/index.js
C:\Users\grand-stack-starter-master\api\node_modules\graphql\validation\validate.js:89
throw new Error(errors.map(function (error) {
^

Error: Unknown directive "relation".

Unknown directive "relation".

Unknown directive "cypher".

Unknown directive "cypher".

Unknown directive "relation".

Unknown directive "relation".

Unknown directive "relation".

Unknown directive "relation".

Unknown directive "relation".

Unknown directive "cypher".
    at assertValidSDL (C:\Users\N19683\grand-stack-starter-master\api\node_modules\graphql\validation\validate.js:89:11)
    at Object.buildASTSchema (C:\Users\N19683\grand-stack-starter-master\api\node_modules\graphql\utilities\buildASTSchema.js:67:34)
    at Object.buildSchemaFromTypeDefinitions (C:\Users\N19683\grand-stack-starter-master\api\node_modules\graphql-tools\src\generate\buildSchemaFromTypeDefinitions.ts:43:32)
    at makeExecutableSchema (C:\Users\N19683\grand-stack-starter-master\api\node_modules\graphql-tools\src\makeExecutableSchema.ts:52:16)
    at Object.<anonymous> (C:/Users/N19683/grand-stack-starter-master/api/src/index.js:18:16)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at loader (C:\Users\N19683\grand-stack-starter-master\api\node_modules\babel-register\lib\node.js:144:5)
    at Object.require.extensions.(anonymous function) [as .js] (C:\Users\N19683\grand-stack-starter-master\api\node_modules\babel-register\lib\node.js:154:7)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
**

Ниже представлено изображение graphql-schema.js

import { neo4jgraphql } from "neo4j-graphql-js";

export const typeDefs = `
type User {
  id: ID!
  name: String
  friends: [User] @relation(name: "FRIENDS", direction: "BOTH")
  reviews: [Review] @relation(name: "WROTE", direction: "OUT")
  avgStars: Float
    @cypher(
      statement: "MATCH (this)-[:WROTE]->(r:Review) RETURN toFloat(avg(r.stars))"
    )
  numReviews: Int
    @cypher(statement: "MATCH (this)-[:WROTE]->(r:Review) RETURN COUNT(r)")
}

type Business {
  id: ID!
  name: String
  address: String
  city: String
  state: String
  reviews: [Review] @relation(name: "REVIEWS", direction: "IN")
  categories: [Category] @relation(name: "IN_CATEGORY", direction: "OUT")
}

type Review {
  id: ID!
  stars: Int
  text: String
  date: Date
  business: Business @relation(name: "REVIEWS", direction: "OUT")
  user: User @relation(name: "WROTE", direction: "IN")
}

type Category {
  name: ID!
  businesses: [Business] @relation(name: "IN_CATEGORY", direction: "IN")
}

type Query {
  usersBySubstring(substring: String): [User]
    @cypher(
      statement: "MATCH (u:User) WHERE u.name CONTAINS $substring RETURN u"
    )
}
`

export const resolvers = {
  Query: {
    Users: neo4jgraphql,
    Business: neo4jgraphql,
    Category: neo4jgraphql,
    Review: neo4jgraphql
  }
};

index.js

import { typeDefs, resolvers } from "./graphql-schema";
import { ApolloServer, gql, makeExecutableSchema  } from "apollo-server";
import { v1 as neo4j } from "neo4j-driver";
import { augmentSchema } from "neo4j-graphql-js";
import dotenv from "dotenv";

// set environment variables from ../.env
dotenv.config();



const schema = makeExecutableSchema({
  typeDefs,
  resolvers
});

const augmentedSchema = augmentSchema(schema);

const driver = neo4j.driver(
  process.env.NEO4J_URI || "bolt://localhost:7689",
  neo4j.auth.basic(
    process.env.NEO4J_USER || "neo4j",
    process.env.NEO4J_PASSWORD || "letmein"
  )
);


const server = new ApolloServer({
  context: { driver },
  schema: augmentedSchema
});

server.listen(process.env.GRAPHQL_LISTEN_PORT, "0.0.0.0").then(({ url }) => {
  console.log(`GraphQL API ready at ${url}`);
});

Может кто-нибудь помочь с исправлениемвопрос! Заранее спасибо

1 Ответ

1 голос
/ 15 октября 2019

Как отмечено в документах

ПРИМЕЧАНИЕ. Используйте augmentSchema, только если вы работаете с существующим объектом GraphQLSchema. В большинстве случаев вам следует использовать makeAugmentedSchema, который может создать объект GraphQLSchema из определений типов.

Ошибка возникает из-за того, что вы пытаетесь использовать makeExecutableSchema для создания схемы. Директивы @relation и @cypher используются исключительно neo4j-graphql. Поскольку они на самом деле не определены как часть вашей схемы, создание вашей схемы с makeExecutableSchema приведет к ошибке, как и при использовании любой другой неопределенной директивы.

Вместо этого вы должны просто использовать makeAugmentedSchema:

const schema = makeAugmentedSchema({
  typeDefs,
  resolvers,
})
const driver = /* ... */
const server = new ApolloServer({
  context: { driver },
  schema,
})
...