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

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

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

    构建API非常有趣!特别是当您可以利用Koa,GraphQL和MongoDB等现代技术时。

    Koa是一个Node框架,就像Express是一个Node框架一样。我们将用Koa替换Express,因为Koa在回调时使用async / await语法。

    入门

    构建API的先决条件如下:

    • 节点安装
    • 文本编辑器; 我选择Visual Studio Code
    • 终奌站
    • 浏览器

    如果您拥有所需的一切,请继续 - 如果没有,请安装它们。

    打开终端并创建一个节点项目,如下所示: 15573815950021.jpg

    到目前为止,我们创建了项目文件夹,并初始化了一个新的Node项目。现在我们有了可用的NPM软件包,可用于安装Koa,Mongo和GraphQL。

    让我们安装koaNPM。

    npm i koa
    

    启动一个新的Koa服务器非常简单。我们需要的只是一个server.js文件,其内容如下:

    const Koa = require('koa');
    
    const app = new Koa();
    
    app.listen(9000);
    
    app.on('error', err => {
      log.error('server error', err)
    });
    

    使用Node启动项目:


    15573816496082.jpg

    安装GraphQL

    我们需要两个软件包来使用Koa设置GraphQL:koa-mount和koa-graphql

    npm i koa-mount koa-graphql
    
    15573816781488.jpg 15573816850846.jpg

    GraphQL要求我们将初始模式传递给GraphQL服务器。让我们创建一个。

    我们将把graphQL架构放在 graphql/schema.js

    const { buildSchema } = require('graphql');
    
    const schema = buildSchema(`
     type Query {
       hello: String
     }
    `);
    
    module.exports = schema;
    

    我们将我们的初始函数传递QuerybuildSchema函数

    注意:请注意该参数的参数buildSchema是模板文字。如果不熟悉,我建议你看一下这篇文章。

    现在我们可以将初始模式传递给GraphQL服务器。

    app.use(mount('/graphql', graphqlHTTP({
     schema: schema,
     graphiql: true
    })))
    

    别忘了导入koa-mountkoa-graphql最后是schema.js

    const mount = require('koa-mount');
    const graphqlHTTP = require('koa-graphql');
    const schema = require('./graphql/schema');
    

    然后,如果我们前往localhost:9000/graphql

    15573818065573.jpg

    初始设置完成。它还不是很有用。理想情况下,我们想查询GraphQL以将数据保存到我们的mongodb并从那里读取。

    设置MongoDB

    为了使用GraphQL进行读写,我们需要一个可以读取的地方。这就是Mongo派上用场的地方。我们将从那里保存并读取我们的数据。

    为了简单起见,我们将为Mongo使用云实例。前往mlab.com并创建用户和mongo数据库。

    创建mongoDB数据库
    创建数据库后,您将需要数据库的用户。

    创建MongoDB用户

    现在您可以使用与Mongoose配对的mongoDB。您的数据库的远程URL将是这样的:

    mongodb://:@ds213615.mlab.com:13615/koa-graphql

    安装mongoose

    npm i mongoose

    创建database.js文件

    我们为数据库连接创建一个专用文件。

    const mongoose = require('mongoose');
    
    const initDB = () => {
    
      mongoose.connect(
        'mongodb://indrek:graphql1@ds213615.mlab.com:13615/koa-graphql',
        { useNewUrlParser: true }
      );
    
      mongoose.connection.once('open', () => {
        console.log('connected to database');
      });
    
    }
    
    module.exports = initDB;
    

    注意:确保使用数据库的用户名和凭据。

    这段代码将尝试连接到远程mongodb。我们现在需要在某处调用它。

    打开server.jsrequire调用initDB方法。

    const  initDB  =  require(' ./database ');
    
    initDB();
    

    如果我们正确地完成了所有工作,我们的控制台应该告诉我们我


    15573821320252.jpg

    请注意不断刷新服务器有多烦人?让我们用一个名为的包来解决这个问题pm2

    PM2是具有内置负载均衡器的Node.js应用程序的生产过程管理器。它允许您永久保持应用程序活动,在不停机的情况下重新加载应用程序,并促进常见的系统管理任务。

    添加一个调用start我们的脚本package.json:

    "scripts": {
      "start": "pm2 start server.js"
    },
    
    15573821891475.jpg

    Pm2在后台运行,这释放了我们的终端。如果您想要停止该过程,请运行pm2 kill。现在我们不必一直重启服务器,pm2自动完成。

    注意:pm2 logs将控制台日志语句返回给终端。

    MongoDB模型

    如果你曾经使用过Mongo,你就知道mongoDB可以让我们为我们的数据创建模型。这是我们构建数据外观的简洁方法。

    创建文件夹模型并在文件内gadgets.js输入:

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    /*
      notice there is no ID. That's because Mongoose will assign
      an ID by default to all schemas
    */
    
    const GadgetSchema = new Schema({
      name: String,
      release_date: Date,
      by_company: String,
      price: Number,
    });
    
    module.exports = mongoose.model('Gadget', GadgetSchema);
    

    注意:我们的架构中没有ID字段。那是因为Mongoose
    默认会为所有模式分配一个ID。

    大。我们还添加一个集合和一些虚拟数据。gadgets在这种情况下,集合名称必须将我们的args名称映射为复数形式。

    15573822600003.jpg

    创建集合后,以JSON格式插入文档,如下所示:


    15573822695160.jpg

    这就是Mongo的全部。让我们用GraphQL获取数据。

    GraphQL查询

    GraphQL也要求我们创建类型。把它想象成计算机的指令。

    graphql/gadgetType.js

    const graphql = require('graphql');
    
    const { GraphQLObjectType, GraphQLString } = graphql;
    
    const GadgetType = new GraphQLObjectType({
      name: 'Gadget',
      fields: () => ({
    
      })
    });
    
    module.exports = GadgetType;
    

    注意我们创建了一个graphql类型。在字段内,我们可以指定给定类型的属性。

    const graphql = require('graphql');
    
    const { GraphQLObjectType, GraphQLObjectType } = graphql;
    
    const GadgetType = new GraphQLObjectType({
      name: 'Gadget',
      fields: () => ({
        id: { type: GraphQLString },
        name: { type: GraphQLString },
        release_date: { type: GraphQLString },
        by_company: { type: GraphQLString },
        price: { type: GraphQLString }
      })
    });
    
    module.exports = GadgetType;
    

    注意我们从graphQL中解构的GraphQLObjectTypeGraphQLObjectType类型。这些是graphQL的原始类型。

    创建graphQL类型也会授予我们在创建查询时使用的类型提示。

    我们需要做的最后一件事是重构我们的schema.js。我们想通过查询argsid。

    导入Gadget模型,gadgetGraphQLTypegraphql类型和GraphQLSchemaGraphQLObjectTypeGraphQLStringgraphQLschema.js

    onst { GraphQLSchema,GraphQLObjectType,GraphQLString } =  require(' graphql ');
    const  gadgetGraphQLType  =   require(' ./gadgetType ');
    const  Gadget  =  require(' ../models/gadget ');
    

    接下来我们需要一个根查询。每个GraphQL查询都以大括号开头{}:

    const RootQuery = new GraphQLObjectType({
      name: 'RootQueryType',
      fields: {
    
      }
    })
    

    瞧!在字段内,我们可以指定gadget查询。

    const RootQuery = new GraphQLObjectType({
      name: 'RootQueryType',
      fields: {
        gadget: {
          type: gadgetGraphQLType,
          args: { id: { type: GraphQLString }},
          resolve(parent, args) {
            return Gadget.findById(args.id)
          }
        }
      }
    })
    

    请注意args查询中的三个属性:

    • type - gadgetGraphQLType在这种情况下,这是查询的类型。
    • args - 我们可以为graphql查询提供参数,例如: gadgets(id: "1")
    • 解决 - 我们如何解决查询?一旦进行查询,应该怎么办?这里我们按id 返回Gadget 模型。

    最后导出它。

    module.exports = new GraphQLSchema({
      query: RootQuery
    });
    

    文件schema.js文件应如下所示:

    const { GraphQLSchema, GraphQLObjectType, GraphQLString} = require('graphql');
    const gadgetGraphQLType =  require('./gadgetType');
    const Gadget = require('../models/gadget');
    
    const RootQuery = new GraphQLObjectType({
      name: 'RootQueryType',
      fields: {
        gadget: {
          type: gadgetGraphQLType,
          args: { id: { type: GraphQLString }},
          resolve(parent, args) {
            return Gadget.findById(args.id)
          }
        }
      }
    })
    
    module.exports = new GraphQLSchema({
      query: RootQuery
    });
    

    现在转到http:// localhost:9000 / graphql并进行查询。

    {
        gadget(id: "5c4e188efb6fc05326ad9264") {
            name
        price
        by_company
        release_date
        id
      }
    }
    

    这就是我们应该最终得到的!

    15573824944085.jpg

    到目前为止,我们可以读取我们的数据,但我们很有可能需要编辑我们的数据记录/文档。任何完整的数据平台都需要一种修改服务器端数据的方法。

    其他章节

    如何使用GraphQL,Koa和MongoDB设置功能强大的API(一)
    如何使用GraphQL,Koa和MongoDB设置功能强大的API(二)
    如何使用GraphQL,Koa和MongoDB设置功能强大的API(三)

    相关文章

      网友评论

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

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