美文网首页
如何使用GraphQL,Koa和MongoDB设置功能强大的AP

如何使用GraphQL,Koa和MongoDB设置功能强大的AP

作者: 楠木唯香 | 来源:发表于2019-05-10 12:11 被阅读0次

欢迎来到我们的第三部分系列,我们在其中设置了一个强大的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(三)

相关文章

网友评论

      本文标题:如何使用GraphQL,Koa和MongoDB设置功能强大的AP

      本文链接:https://www.haomeiwen.com/subject/ggoooqtx.html