我目前正在研究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
结构似乎是正确的方式,所以我猜测问题出在解决功能上,我不知道如何正确定义。
这里是使用GraphQL查询时的结果:
{
"data": {
"bankRootQuery": null
}
}
如果字段解析为null
,则该图的“分支”的执行结束。即使字段的类型是对象类型,也不会调用其“子级”字段的解析程序。想象一下,如果您有一个类似user
的字段-如果该字段解析为null
,那么尝试解析用户的name
或email
毫无意义。
您用于bankRootQuery
字段的解析器仅记录到控制台。由于它没有return
语句,因此其返回值为undefined
。 undefined
的值被强制为null
。由于该字段解析为null,因此执行暂停。
如果要返回非null的内容,那么您的解析器需要返回something
-即使它只是一个空对象({}
)。然后,任何“子”字段的解析器将按预期工作。通常,我建议您不要像这样嵌套查询-只需将其保留在根级别即可。有关场分辨率如何工作的其他详细信息,请查看this post。