将解析函数从 GraphQLObjectType 回滚到另一个
Rolling back resolve function from GraphQLObjectType to another
我目前正在学习 GraphQL,作为开发过程的一部分,我对代码的模块化很感兴趣——我确实了解如何编写查询,但不了解如何正确实现查询的查询。
也就是rootQuery.js
const {
GraphQLInt,
GraphQLList,
GraphQLObjectType,
GraphQLSchema,
GraphQLFloat,
GraphQLString
} = require("graphql");
const bankRootQuery = require('../graphql/queries/bank.queries')
const rootQuery = new GraphQLObjectType({
name: "rootQuery",
fields: {
bankRootQuery: { type: bankRootQuery, resolve: () => { console.log(bankRootQuery.resolve) } }
}
});
module.exports = new GraphQLSchema({
query: rootQuery
});
这里是 bankRootQuery.js:
const { GraphQLObjectType, GraphQLInt, GraphQLNonNull, GraphQLID, GraphQLList } = require("graphql");
const BankType = require('../types/bank.type');
const models = require('../../models/models_handler');
module.exports = new GraphQLObjectType({
name: "bankRootQuery",
fields: {
getbanks: {
type: new GraphQLList(BankType),
resolve: () => {
return models.getBanks()
}
},
getbankByID: {
type: BankType,
args: {
bankID: { name: "bankID", type: GraphQLInt }
},
resolve: (_, args) => {
if (!models.getBanks().has(args.bankID))
throw new Error(`Bank with ID ${args.bankID} doesn't exists`);
return models.getBank(args.bankID);}
}
}
});
将 bankRootQuery
分配给方案对象而不是 rootQuery
工作得很好,但是在使用 GraphiQL 查询时使用 rootQuery
会产生空结果 - Documentation Explorer
结构似乎是正确的方式,所以我猜问题出在 resolve 函数上,我不明白如何正确定义它。
这是使用 GraphQL 查询时的结果:
{
"data": {
"bankRootQuery": null
}
}
如果字段解析为 null
,则图的 "branch" 的执行结束。即使字段的类型是对象类型,也会调用其 "children" 字段的 none 个解析器。想象一下,如果您有一个像 user
这样的字段——如果该字段解析为 null
,那么尝试解析用户的 name
或 email
是没有意义的。
bankRootQuery
字段的解析器只记录到控制台。因为它没有 return
语句,所以它的 return 值为 undefined
。 undefined
的值被强制转换为 null
。由于该字段解析为空,执行停止。
如果你想 return 不是 null 的东西,那么你的解析器需要 return 东西 -- 即使它只是一个空对象 ( {}
)。然后任何 "child" 字段的解析器将按预期工作。
一般来说,我建议不要像这样嵌套您的查询 - 只需将它们保留在根级别即可。有关字段解析如何工作的更多详细信息,请查看 。
我目前正在学习 GraphQL,作为开发过程的一部分,我对代码的模块化很感兴趣——我确实了解如何编写查询,但不了解如何正确实现查询的查询。
也就是rootQuery.js
const {
GraphQLInt,
GraphQLList,
GraphQLObjectType,
GraphQLSchema,
GraphQLFloat,
GraphQLString
} = require("graphql");
const bankRootQuery = require('../graphql/queries/bank.queries')
const rootQuery = new GraphQLObjectType({
name: "rootQuery",
fields: {
bankRootQuery: { type: bankRootQuery, resolve: () => { console.log(bankRootQuery.resolve) } }
}
});
module.exports = new GraphQLSchema({
query: rootQuery
});
这里是 bankRootQuery.js:
const { GraphQLObjectType, GraphQLInt, GraphQLNonNull, GraphQLID, GraphQLList } = require("graphql");
const BankType = require('../types/bank.type');
const models = require('../../models/models_handler');
module.exports = new GraphQLObjectType({
name: "bankRootQuery",
fields: {
getbanks: {
type: new GraphQLList(BankType),
resolve: () => {
return models.getBanks()
}
},
getbankByID: {
type: BankType,
args: {
bankID: { name: "bankID", type: GraphQLInt }
},
resolve: (_, args) => {
if (!models.getBanks().has(args.bankID))
throw new Error(`Bank with ID ${args.bankID} doesn't exists`);
return models.getBank(args.bankID);}
}
}
});
将 bankRootQuery
分配给方案对象而不是 rootQuery
工作得很好,但是在使用 GraphiQL 查询时使用 rootQuery
会产生空结果 - Documentation Explorer
结构似乎是正确的方式,所以我猜问题出在 resolve 函数上,我不明白如何正确定义它。
这是使用 GraphQL 查询时的结果:
{
"data": {
"bankRootQuery": null
}
}
如果字段解析为 null
,则图的 "branch" 的执行结束。即使字段的类型是对象类型,也会调用其 "children" 字段的 none 个解析器。想象一下,如果您有一个像 user
这样的字段——如果该字段解析为 null
,那么尝试解析用户的 name
或 email
是没有意义的。
bankRootQuery
字段的解析器只记录到控制台。因为它没有 return
语句,所以它的 return 值为 undefined
。 undefined
的值被强制转换为 null
。由于该字段解析为空,执行停止。
如果你想 return 不是 null 的东西,那么你的解析器需要 return 东西 -- 即使它只是一个空对象 ( {}
)。然后任何 "child" 字段的解析器将按预期工作。
一般来说,我建议不要像这样嵌套您的查询 - 只需将它们保留在根级别即可。有关字段解析如何工作的更多详细信息,请查看