欢迎来到我们的第三部分系列,我们在其中设置了一个强大的API 到目前为止,我们已经实现了基本的CRUD功能。
随着我们的应用程序的增长,我们的Mutation数也在增 为了拥有尽可能干净的代码库,我们应该将mutations提取到专用文件中。这样我们就可以确保我们的代码是模块化的,并分成可维护的块。
让我们创建一个文件夹graphql/mutations和文件夹中创建addGadget.js,updateGadget和removeGadget文件..
我们只是将Mutation对象放入文件并导出它们。
将addGadgetMutation移动到单独的文件
graphql/mutations/addGadget.js
const { GraphQLObjectType, GraphQLString } = require('graphql');
const gadgetGraphQLType = require('./../gadgetType');
const Gadget = require('./../../models/gadget');
module.exports = {
type: gadgetGraphQLType,
args: {
name: { type: GraphQLString },
release_date: { type: GraphQLString },
by_company: { type: GraphQLString },
price: { type: GraphQLString }
},
resolve(parent, args) {
const newGadget = new Gadget({
name: args.name,
release_date: args.release_date,
by_company: args.by_company,
price: args.price,
})
return newGadget.save();
}
};
更新mutations;
graphql/mutations/updateGadget.js
const { GraphQLObjectType, GraphQLString } = require('graphql');
const gadgetGraphQLType = require('./../gadgetType');
const Gadget = require('./../../models/gadget');
module.exports = {
type: gadgetGraphQLType,
args: {
id: { type: GraphQLString },
name: { type: GraphQLString },
release_date: { type: GraphQLString },
by_company: { type: GraphQLString },
price: { type: GraphQLString }
},
resolve(parent, args) {
return Gadget.findById(args.id)
.then(gadget => {
gadget.name = args.name,
gadget.release_date = args.release_date,
gadget.by_company = args.by_company,
gadget.price = args.price
return gadget.save()
})
.then(updatedGadget => updatedGadget)
.catch(err => console.log(err))
}
};
最后是删除mutations。
graphql/mutations/removeGadget.js
const { GraphQLObjectType, GraphQLString } = require('graphql');
const gadgetGraphQLType = require('./../gadgetType');
const Gadget = require('./../../models/gadget');
module.exports = {
type: gadgetGraphQLType,
args: {
id: { type: GraphQLString }
},
resolve(parent, args) {
return Gadget.findOneAndDelete(args.id).exec()
.then(gadget => gadget.remove())
.then(deletedGadget => deletedGadget)
.catch(err => console.log(err))
}
};
我们将它们放在单独的文件中后,我们就可以更改graphql/mutations.js文件了。
const { GraphQLObjectType, GraphQLString } = require('graphql');
const addGadget = require('./mutations/addGadget');
const updateGadget = require('./mutations/updateGadget');
const removeGadget = require('./mutations/removeGadget');
const Mutation = new GraphQLObjectType({
name: 'Mutation',
fields: {
addGadget,
updateGadget,
removeGadget,
}
})
module.exports = Mutation;
非常简洁
这就是我们的项目现在的样子;
15573832643778.jpg我们的GraphQL API正在形成良好的状态。到目前为止,我们有一个专门的mutations文件夹。让我们对查询做同样的事情。
为查询创建一个文件夹 - graphql/queries并将rootQuery.js文件放在那里。
在rootQuery.js文件内部,我们放置了只获取数据的所有查询。这样我们就有了用于查询和mutations的单独文件夹。查询和mutations之间的区别很简单 - 查询只是从数据库中读取数据,mutations会改变我们数据库的状态。
graphql/queries/rootQuery.js
const { GraphQLObjectType, GraphQLString, GraphQLList } = require('graphql');
const gadgetGraphQLType = require('./../gadgetType');
const Gadget = require('../../models/gadget');
const queryAllGadgets = require('./queryAllGadgets')
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
gadget: {
type: gadgetGraphQLType,
args: { id: { type: GraphQLString }},
resolve(parent, args) {
return Gadget.findById(args.id)
}
},
}
})
module.exports = RootQuery;
将rootQuery导入到我们的 schema.js
const { GraphQLSchema } = require('graphql');
const RootQuery = require('./queries/rootQuery');
const Mutations = require('./mutations');
module.exports = new GraphQLSchema({
query: RootQuery,
mutation: Mutations
});
现在在rootQuery中我们指定所有查询。创建一个文件,用于获取所有数据并按ID获取数据。
- graphql/queries/queryAllGadgets.js
- graphql/queries/queryGadgetById.js
将以下逻辑放在里面 graphql/queries/queryGadgetById.js
const { GraphQLString } = require('graphql');
const gadgetGraphQLType = require('./../gadgetType');
const Gadget = require('../../models/gadget');
module.exports = {
type: gadgetGraphQLType,
args: { id: { type: GraphQLString }},
resolve(parent, args) {
return Gadget.findById(args.id)
}
},
并获取所有数据 - graphql/queries/queryAllGadgets.js
const { GraphQLList } = require('graphql');
const gadgetGraphQLType = require('./../gadgetType');
const Gadget = require('../../models/gadget');
module.exports = {
type: new GraphQLList(gadgetGraphQLType),
args: {},
resolve() {
return Gadget.find({})
}
}
请注意新类型GraphQLList- 如果我们想要返回对象列表(在这种情况下为所有数据),则使用此类型。
现在我们必须将查询导入到我们的 rootQuery
const { GraphQLObjectType } = require('graphql');
const Gadget = require('../../models/gadget');
const queryAllGadgets = require('./queryAllGadgets')
const queryGadgetById = require('./queryGadgetById');
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
queryGadgetById,
queryAllGadgets,
}
})
module.exports = RootQuery;
瞧!现在,让我们从数据库中查询所有数据。
15573833506873.jpg这是GraphQL查询;
{
queryAllGadgets {
name,
id,
price,
release_date,
by_company
}
}
我们的项目结构应如下所示;
15573833657744.jpg不要忘记更新我们使用的路径gadgetType(mutations和查询)
const gadgetGraphQLType = require('./../types/gadgetType');
测试我们的查询
在转向更高级的概念之前,我想向您展示一个工具,让我们可以查询graphql查询,如果您曾经使用过postman或Insomnia,您会感到宾至如归。
我使用Insomnia,因为它是免费的,具有开箱即用的强大功能,并且是开源的。
免责声明:我与Insomnia无关 - 我只是喜欢这个工具。
15573834500207.jpg打开该工具,创建一个名为的新请求queryAllGadgets。在顶部我们的localhost地址(http:// localhost:9000 / graphql)并指定正文是graphQL。
15573835071141.jpg
最后,将graphQL查询放在body请求中。
15573835129605.jpg我们现在可以随意地查询graphQL,就像我们使用REST一样。如果REST可以做到这一点,GraphQL也可以。
其他章节
如何使用GraphQL,Koa和MongoDB设置功能强大的API(一)
如何使用GraphQL,Koa和MongoDB设置功能强大的API(二)
如何使用GraphQL,Koa和MongoDB设置功能强大的API(三)
网友评论