美文网首页
如何使用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