Не могу использовать @cypher в схеме GraphQL при использовании ApolloWebserver - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу запросить поле на узле, используя директиву @cypher в моей схеме GraphQL.

Однако, когда я запрашиваю поле, я получаю Resolve function for \"Link.x\" returned undefined.

Моя схема с Директива на x от Link имеет следующий вид:

scalar URI

interface IDisplayable{
  "Minimal data necessary for the object to appear on screen"
  id: ID!
  label: String
  story: URI
}

interface ILink{
  """
  A link must know to what nodes it is connected to
  """
  x: Node! @cypher(statement: "MATCH (this)-[:X_NODE]->(n:Node) RETURN n")
  y: Node!
  """
  if optional=true then sequence MAY be used to define a set of options
  """
  optional: Boolean
}

interface INode{
  synchronous: Boolean
  unreliable: Boolean
}

type Node implements INode & IDisplayable{
  id: ID!
  label: String!
  story: URI
  synchronous: Boolean
  unreliable: Boolean
}

type Link implements ILink & IDisplayable{
  id: ID!
  label: String!
  x: Node! @cypher(statement: "MATCH (this)-[:X_NODE]->(n:Node) RETURN n")
  y: Node!
  story: URI
  optional: Boolean
}

При запросе ссылки aa и ее свойства x я получаю неопределенное значение. С пользовательским распознавателем, который я написал для вас, он работает. Конечно, я мог бы оставить рукописные средства распознавания, но это большой код, который не нужен.

Это индекс. js:

require( 'dotenv' ).config();
const express = require( 'express' );
const { ApolloServer } = require( 'apollo-server-express' );
const neo4j = require( 'neo4j-driver' );
const cors = require( 'cors' );
const { makeAugmentedSchema } = require( 'neo4j-graphql-js' );
const typeDefs = require( './graphql-schema' );
const resolvers = require( './resolvers' );

const app = express();
app.use( cors() );

const URI = `bolt://${ process.env.DB_HOST }:${ process.env.DB_PORT }`;
const driver = neo4j.driver(
    URI,
    neo4j.auth.basic( process.env.DB_USER, process.env.DB_PW ),
);

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

const server = new ApolloServer( {
    context: { driver },
    schema,
    formatError: ( err ) => {
        return {
            message: err.message,
            code: err.extensions.code,
            success: false,
            stack: err.path,
        };
    },
} );

const port = process.env.PORT;
const path = process.env.ENDPOINT;

server.applyMiddleware( { app, path } );

app.listen( { port, path }, () => {
    console.log( `Server listening at http://localhost:${ port }${ path }` );
} );

С "graphql-schema. js "существо

const fs = require( 'fs' );
const path = require( 'path' );
const schema = './schemas/schema.graphql';
const encoding = 'utf-8';

let typeDefs = '';
typeDefs += fs.readFileSync( path.join( __dirname, schema ) )
    .toString( encoding );

module.exports = typeDefs;

Спасибо за любые советы

1 Ответ

0 голосов
/ 16 апреля 2020

Я обнаружил, что, если я напишу пользовательский распознаватель для запроса, директивы, предоставленные Apollo, не будут работать. Однако я понял, что могу позволить Apollo создавать запросы, в которых я нуждался, поэтому я просто удалил свои пользовательские реализации, что работает для меня.

Так что в моих средствах распознавания мне пришлось удалить реализации для запросов, которые выбирали поля, помеченные запрос @cypher, тогда я мог бы поместить директиву в мою схему, и они работали нормально.

...