GraphQL之前后端实践Demo

Before

install

$ npm init 
$ npm i express apollo-server-express;
$ touch ./index.js

Start

安装配置完成之后,就应该设计一个demo了!所以,这个demo应该怎么设计呢❓
⬇️⬇️

  • code - 1

    const express = require("express");
    const { ApolloServer } = require("apollo-server-express");
    
    const PORT = 4000;
    const app = express();
    
    const box = {
      width: 100,
      height: 200,
      weight: "100g",
      color: "white"
    }
    
    const typeDefs = [`
    """
    一个盒子模型
    """
    type Box{
      """
      这是盒子的宽度
      """
      width:Int,
      height:Int,
      color:String
    }
    
    type Query {
      getBox: Box
    }
    
    type Mutation{
      setWidth(width:Int):Box
    }
    
    schema {
      query: Query,
      mutation: Mutation
    }`]
    
    const resolvers = {
      Query: {
        getBox(_) {
          return box;
        }
      },
      Mutation: {
        setWidth(_, { width }) {
          box.width = width;
          return box
        }
      }
    };
    
    const server = new ApolloServer({
      typeDefs,
      resolvers
    });
    // 将Apollo作为Express的一个中间件
    server.applyMiddleware({ app });
    
    app.listen(PORT, () =>
      console.log(
        `🚀 Server ready at http://localhost:${PORT}${server.graphqlPath}`
      )
    );
    

    上面的代码呢可以实现一个最简单的GraphQL服务器(Apollo Server是graphql规范的一个实现)什么是Apollo Server?

  • 说明:在new一个ApolloServer的时候 ⬇️⬇️
    传入了typeDefs和一个resolvers这两个参数,其中:

    参数含义
    typeDefs是一个字符串或者字符串数组,里面的内容是我们定义的schema
    resolvers是schema的实现,也就是typeDefs里的Query和Mutation,注意所有的schema都要实现之后程序才能启动

演示

  • query

    query {
      getBox {
        width
        height
        color
      }
    }
    
  • mutation

    mutation {
      setWidth(width: 108) {
        width
        height
        color
      }
    }
    
  • 传参
    刚刚的mutation我们直接在语句里写了参数,因为语句本身是字符串不利于组合,同时也不适合传递复杂的参数,所以我们需要定义参数。点击playground左下的Query Variables,在这里可以声明参数,注意需要是标准json格式

    {
      "length": 128
    }
    

    同时需要修改一下mutation语句⬇️⬇️

    mutation($length: Int) {
      setWidth(width: $length) {
        width
      }
    }
    
  • code - 2
    给盒子里装点随机的小球,将数据源修改为如下形式 ⬇️⬇️

    class Ball {
      constructor() {
        this.size = ((Math.random() * 10) | 0) + 5;
        this.color = ["black", "red", "white", "blue"][(Math.random() * 4) | 0];
      }
    }
    const box = {
      width: 100,
      height: 200,
      weight: "100g",
      color: "white",
      balls: new Array(10).fill().map(n => new Ball())
    }
    

    然后在typeDefs中增加一个类型,并且修改box的类型 ⬇️⬇️

    type Box{
      width:Int,
      height:Int,
      color:String,
      balls:[Ball]
    }
    
    type Ball{
      size:Int,
      color:String
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值