使用 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的主要内容,如果未能解决你的问题,请参考以下文章
当用户在 unordered_map 中自定义哈希函数时,无法解码 g++ 中的模糊编译器错误
无法在ubuntu 14.04.4 LTS上安装g ++(我试过命令和软件中心)
无法让“npm install -g”在任何包上工作(AppData/Roaming/npm 始终为空)
Google Plus Open Graph 错误:当 UTM 或其他查询字符串附加到 URL 时,G+ 无法识别打开的图形图像