使用 ApolloWebserver 时无法在 GraphQL 架构中使用 @cypher

Posted

技术标签:

【中文标题】使用 ApolloWebserver 时无法在 GraphQL 架构中使用 @cypher【英文标题】:Can't use @cypher in GraphQL schema when using ApolloWebserver 【发布时间】:2020-07-28 21:07:46 【问题描述】:

我想在我的 GraphQL 架构中使用 @cypher 指令查询节点上的字段。

但是,当我查询该字段时,我得到Resolve function for \"Link.x\" returned undefined

我的架构与来自 Link 的 x 指令如下

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

当查询链接及其 x 属性时,我得到未定义。使用我为 y 编写的自定义解析器,它可以工作。当然我可以留下手写的解析器,但它有很多代码是不必要的。

这是 index.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】:

我发现,如果我为查询编写自定义解析器,Apollo 提供的指令不起作用。 但是我意识到我可以让 Apollo 创建我需要的查询,所以我只是删除了我的自定义实现,这对我有用。

因此,在我的解析器中,我必须删除那些会获取带有 @cypher 查询注释的字段的查询的实现,然后我可以将指令放入我的架构中并且它们运行良好。

【讨论】:

以上是关于使用 ApolloWebserver 时无法在 GraphQL 架构中使用 @cypher的主要内容,如果未能解决你的问题,请参考以下文章

G++ 编译,可执行文件无法运行

当用户在 unordered_map 中自定义哈希函数时,无法解码 g++ 中的模糊编译器错误

Mac 上的 G++ 链接时优化 - 编译器/链接器错误?

无法在ubuntu 14.04.4 LTS上安装g ++(我试过命令和软件中心)

无法让“npm install -g”在任何包上工作(AppData/Roaming/npm 始终为空)

Google Plus Open Graph 错误:当 UTM 或其他查询字符串附加到 URL 时,G+ 无法识别打开的图形图像