歡迎來到我們的第三部分系列把夸,我們在其中設置了一個強大的API 到目前為止,我們已經實現(xiàn)了基本的CRUD功能铭污。
隨著我們的應用程序的增長恋日,我們的Mutation數(shù)也在增 為了擁有盡可能干凈的代碼庫膀篮,我們應該將mutations提取到專用文件中。這樣我們就可以確保我們的代碼是模塊化的岂膳,并分成可維護的塊各拷。
讓我們創(chuàng)建一個文件夾graphql/mutations和文件夾中創(chuàng)建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;
非常簡潔
這就是我們的項目現(xiàn)在的樣子;
我們的GraphQL API正在形成良好的狀態(tài)速蕊。到目前為止,我們有一個專門的mutations文件夾娘赴。讓我們對查詢做同樣的事情规哲。
為查詢創(chuàng)建一個文件夾 - graphql/queries并將rootQuery.js文件放在那里。
在rootQuery.js文件內部诽表,我們放置了只獲取數(shù)據(jù)的所有查詢唉锌。這樣我們就有了用于查詢和mutations的單獨文件夾。查詢和mutations之間的區(qū)別很簡單 - 查詢只是從數(shù)據(jù)庫中讀取數(shù)據(jù)竿奏,mutations會改變我們數(shù)據(jù)庫的狀態(tài)袄简。
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
});
現(xiàn)在在rootQuery中我們指定所有查詢。創(chuàng)建一個文件泛啸,用于獲取所有數(shù)據(jù)并按ID獲取數(shù)據(jù)绿语。
- 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)
}
},
并獲取所有數(shù)據(jù) - 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- 如果我們想要返回對象列表(在這種情況下為所有數(shù)據(jù)),則使用此類型候址。
現(xiàn)在我們必須將查詢導入到我們的 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;
瞧吕粹!現(xiàn)在,讓我們從數(shù)據(jù)庫中查詢所有數(shù)據(jù)岗仑。
這是GraphQL查詢;
{
queryAllGadgets {
name,
id,
price,
release_date,
by_company
}
}
我們的項目結構應如下所示;
不要忘記更新我們使用的路徑gadgetType(mutations和查詢)
const gadgetGraphQLType = require('./../types/gadgetType');
測試我們的查詢
在轉向更高級的概念之前匹耕,我想向您展示一個工具,讓我們可以查詢graphql查詢荠雕,如果您曾經使用過postman或Insomnia稳其,您會感到賓至如歸。
我使用Insomnia舞虱,因為它是免費的欢际,具有開箱即用的強大功能母市,并且是開源的矾兜。
免責聲明:我與Insomnia無關 - 我只是喜歡這個工具。
打開該工具患久,創(chuàng)建一個名為的新請求queryAllGadgets椅寺。在頂部我們的localhost地址(http:// localhost:9000 / graphql)并指定正文是graphQL浑槽。
最后,將graphQL查詢放在body請求中返帕。
我們現(xiàn)在可以隨意地查詢graphQL桐玻,就像我們使用REST一樣。如果REST可以做到這一點荆萤,GraphQL也可以镊靴。
其他章節(jié)
如何使用GraphQL,Koa和MongoDB設置功能強大的API(一)
如何使用GraphQL链韭,Koa和MongoDB設置功能強大的API(二)
如何使用GraphQL偏竟,Koa和MongoDB設置功能強大的API(三)