Graphql错误未定义添加关系(Graphql Error undefined adding a relationship)

编程入门 行业动态 更新时间:2024-10-05 13:21:49
Graphql错误未定义添加关系(Graphql Error undefined adding a relationship)

我有以下结构。 每个帐户都可以有一种安全类型。 所以它是从SecurityType到Account的一对多。 一切都使用代码

File: AccountSchema.js const SecurityType = require('./LookupSchema').SecurityType; console.log(Account); const Account = new GraphQLObjectType({ name: 'Account', description: 'Account access', fields: () => ({ id: { type: GraphQLString }, security_type: { type: SecurityType, resolve(parent, args, ast){ return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.security_type_id]; db.query(db.connection, `SELECT * FROM lookups.security_type WHERE id = $1`, parameters) .then(result => { resolve(result.entrys.rows[0]); }) .catch(err => { reject(err.message); }); }); } } }) }); module.exports = { Account : Account } File: LookupSchema.js const Account = require('./AccountSchema').Account; console.log(Account); const SecurityType = new GraphQLObjectType({ name: 'SecurityType', description: 'Used to for specifying security type', fields: () => ({ id: { type: GraphQLString } }) }); module.exports = { SecurityType: SecurityType } File: Query.js const Query = new GraphQLObjectType({ name: 'Query', description: 'Root query object', fields: () => ({ accounts: { type: new GraphQLList(Account), resolve(root, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, `SELECT * FROM accounts.account`, parameters) .then(result => { console.log(result); resolve(result.entrys.rows); }) .catch(err => { console.log(err); reject(err.message); }); }); } }, securityTypes: { type: new GraphQLList(SecurityType), resolve(root){ return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, `SELECT * FROM lookups.security_type`, parameters) .then(result => { resolve(result.entrys.rows); }) .catch(err => { reject(err.message); }); }); } } }) });

我遇到的问题是当我向LookupSchema.js文件添加帐户时

const SecurityType = new GraphQLObjectType({ name: 'SecurityType', description: 'Used to for specifying security type', fields: () => ({ id: { type: GraphQLString }, accounts: { type: new GraphQLList(Account), resolve(parent, args, ast){ return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.id]; db.query(db.connection, `SELECT * FROM accounts.account WHERE security_type_id = $1`, parameters) .then(result => { resolve(result.entrys.rows); }) .catch(err => { reject(err.message); }); }); } } }) });

启动服务时出现以下错误

错误:只能创建GraphQLType的List但得到:undefined。

我为每个帐户和SecurityType设置了console.log来检查导入,我在LookupSchema中注意到,未定义帐户。 我做了一些研究,这可能是一个循环问题,但不太确定它的解决方案。

任何建议将不胜感激

I have the following structure. Every Account can have one security type. So its a one-to-many from SecurityType to Account. Everything works using the code

File: AccountSchema.js const SecurityType = require('./LookupSchema').SecurityType; console.log(Account); const Account = new GraphQLObjectType({ name: 'Account', description: 'Account access', fields: () => ({ id: { type: GraphQLString }, security_type: { type: SecurityType, resolve(parent, args, ast){ return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.security_type_id]; db.query(db.connection, `SELECT * FROM lookups.security_type WHERE id = $1`, parameters) .then(result => { resolve(result.entrys.rows[0]); }) .catch(err => { reject(err.message); }); }); } } }) }); module.exports = { Account : Account } File: LookupSchema.js const Account = require('./AccountSchema').Account; console.log(Account); const SecurityType = new GraphQLObjectType({ name: 'SecurityType', description: 'Used to for specifying security type', fields: () => ({ id: { type: GraphQLString } }) }); module.exports = { SecurityType: SecurityType } File: Query.js const Query = new GraphQLObjectType({ name: 'Query', description: 'Root query object', fields: () => ({ accounts: { type: new GraphQLList(Account), resolve(root, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, `SELECT * FROM accounts.account`, parameters) .then(result => { console.log(result); resolve(result.entrys.rows); }) .catch(err => { console.log(err); reject(err.message); }); }); } }, securityTypes: { type: new GraphQLList(SecurityType), resolve(root){ return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, `SELECT * FROM lookups.security_type`, parameters) .then(result => { resolve(result.entrys.rows); }) .catch(err => { reject(err.message); }); }); } } }) });

The problem I have is when I add to the file LookupSchema.js the accounts

const SecurityType = new GraphQLObjectType({ name: 'SecurityType', description: 'Used to for specifying security type', fields: () => ({ id: { type: GraphQLString }, accounts: { type: new GraphQLList(Account), resolve(parent, args, ast){ return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.id]; db.query(db.connection, `SELECT * FROM accounts.account WHERE security_type_id = $1`, parameters) .then(result => { resolve(result.entrys.rows); }) .catch(err => { reject(err.message); }); }); } } }) });

I get the following error when I start the service

Error: Can only create List of a GraphQLType but got: undefined.

I put console.log for each Account and SecurityType to check for the import and I noticed in LookupSchema, Account is undefined. I did some research and this might be a circular issue but not quite sure a solution for it.

Any advise would be appreciated

最满意答案

要避免循环问题,可以在fields()函数中使用require函数。

因此,Inside AccountSchema.js fields:()函数将首先import SecurityType然后我们将使用return {}的其他字段,对于其他文件也是如此。

AccountSchema.js

const { GraphQLObjectType, GraphQLString, } = require('graphql'); const Account = new GraphQLObjectType({ name: 'Account', description: 'Account access', fields: () => { const SecurityType = require('./LookUpSchema'); return { id: { type: GraphQLString, }, security_type: { type: SecurityType, resolve(parent, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.security_type_id]; db.query(db.connection, 'SELECT * FROM lookups.security_type WHERE id = $1', parameters) .then((result) => { resolve(result.entrys.rows[0]); }) .catch((err) => { reject(err.message); }); }); }, }, }; }, }); module.exports = Account;

LookUpSchema.js

const { GraphQLObjectType, GraphQLString, GraphQLList, } = require('graphql'); const SecurityType = new GraphQLObjectType({ name: 'SecurityType', description: 'Used to for specifying security type', fields: () => { const Account = require('./AccountSchema'); return { id: { type: GraphQLString, }, accounts: { type: new GraphQLList(Account), resolve(parent, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.id]; db.query(db.connection, 'SELECT * FROM accounts.account WHERE security_type_id = $1', parameters) .then((result) => { resolve(result.entrys.rows); }) .catch((err) => { reject(err.message); }); }); }, }, }; }, }); module.exports = SecurityType;

Query.js

const { GraphQLList, GraphQLObjectType, GraphQLSchema, } = require('graphql'); const Account = require('./AccountSchema'); const SecurityType = require('./LookUpSchema'); console.log('Account', Account); const Query = new GraphQLObjectType({ name: 'Query', description: 'Root query object', fields: () => ({ accounts: { type: new GraphQLList(Account), resolve(root, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, 'SELECT * FROM accounts.account', parameters) .then((result) => { console.log(result); resolve(result.entrys.rows); }) .catch((err) => { console.log(err); reject(err.message); }); }); }, }, securityTypes: { type: new GraphQLList(SecurityType), resolve(root) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, 'SELECT * FROM lookups.security_type', parameters) .then((result) => { resolve(result.entrys.rows); }) .catch((err) => { reject(err.message); }); }); }, }, }), }); const schema = new GraphQLSchema({ query: Query, // mutation: MutationType, }); module.exports = schema;

GraphiQL

在此处输入图像描述

To avoide the Cyclic Problem you can use the require function inside the fields() function.

So, Inside AccountSchema.js fields:() function will first import the SecurityType then only we will be using the the other fields with the return {}, same for other files.

AccountSchema.js

const { GraphQLObjectType, GraphQLString, } = require('graphql'); const Account = new GraphQLObjectType({ name: 'Account', description: 'Account access', fields: () => { const SecurityType = require('./LookUpSchema'); return { id: { type: GraphQLString, }, security_type: { type: SecurityType, resolve(parent, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.security_type_id]; db.query(db.connection, 'SELECT * FROM lookups.security_type WHERE id = $1', parameters) .then((result) => { resolve(result.entrys.rows[0]); }) .catch((err) => { reject(err.message); }); }); }, }, }; }, }); module.exports = Account;

LookUpSchema.js

const { GraphQLObjectType, GraphQLString, GraphQLList, } = require('graphql'); const SecurityType = new GraphQLObjectType({ name: 'SecurityType', description: 'Used to for specifying security type', fields: () => { const Account = require('./AccountSchema'); return { id: { type: GraphQLString, }, accounts: { type: new GraphQLList(Account), resolve(parent, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = [parent.id]; db.query(db.connection, 'SELECT * FROM accounts.account WHERE security_type_id = $1', parameters) .then((result) => { resolve(result.entrys.rows); }) .catch((err) => { reject(err.message); }); }); }, }, }; }, }); module.exports = SecurityType;

Query.js

const { GraphQLList, GraphQLObjectType, GraphQLSchema, } = require('graphql'); const Account = require('./AccountSchema'); const SecurityType = require('./LookUpSchema'); console.log('Account', Account); const Query = new GraphQLObjectType({ name: 'Query', description: 'Root query object', fields: () => ({ accounts: { type: new GraphQLList(Account), resolve(root, args, ast) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, 'SELECT * FROM accounts.account', parameters) .then((result) => { console.log(result); resolve(result.entrys.rows); }) .catch((err) => { console.log(err); reject(err.message); }); }); }, }, securityTypes: { type: new GraphQLList(SecurityType), resolve(root) { return new Promise((resolve, reject) => { const db = ast.db; const parameters = []; db.query(db.connection, 'SELECT * FROM lookups.security_type', parameters) .then((result) => { resolve(result.entrys.rows); }) .catch((err) => { reject(err.message); }); }); }, }, }), }); const schema = new GraphQLSchema({ query: Query, // mutation: MutationType, }); module.exports = schema;

GraphiQL

enter image description here

更多推荐

本文发布于:2023-08-07 17:00:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1465243.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:错误   关系   未定义   Graphql   relationship

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!