GraphQL入门之变更输入类型

前一篇文章介绍了变更操作,在创建 User 对象的时候,只传递了 name 和 email 参数,但是如果属性太多或者创建对象的时候只需要部分必选参数,直接把属性都当成参数就不合适了,这里 GraphQL 提供了 Input Type 参数来解决这个问题。下面看个例子。

创建 Node.js 的工程

mkdir myapp
cd myapp
npm init (一路回车)

安装依赖包

npm install @apollo/server graphql

定义 Schema

创建 schema.graphql 文件,内容如下:

type User {
    id: ID!
    name: String!
    email: String!
}

type Query {
    users: [User],
}

input UserInput {
  name: String!
  email: String!
}

type Mutation {
  createUser(user: UserInput!) : User!
}

schema {
  query: Query
  mutation: Mutation
}

schema 文件主要包括:

  1. 新增了输入参数 UserInput 的定义,作为演示只包含两个参数 name 和 email。
  2. 修改变更操作不再使用 name 和 email 作为参数,而是改成使用输入参数 UserInput。

实现处理器

创建 resolvers.js 文件,内容如下:

const user1 = {id: 1, name: 'user1', email: 'user1@gmail.com'};
const user2 = {id: 2, name: 'user2', email: 'user2@gmail.com'};
const user3 = {id: 3, name: 'user3', email: 'user3@gmail.com'};
const users = [user1, user2, user3];

const resolvers = {
  Query: {
    users: () => users,
  },

  Mutation: {
    createUser(obj, args, context, info) {
      let user = {id: users.length + 1,name: args.user.name, email: args.user.email};
      users.push(user);
      return user;
    }
  }
};

module.exports = resolvers;

处理器函数有些变化,主要就是 args 里不直接使用 name 和 email 属性,而是通过 args 中的 user 对象来间接使用。

主程序

创建 server.js 文件,内容如下:

const { ApolloServer } =  require('@apollo/server');
const { startStandaloneServer } = require('@apollo/server/standalone');
const fs = require("fs");

const typeDefs = fs.readFileSync('./schema.graphql').toString();
const resolvers = require('./resolvers');

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

startStandaloneServer(server).then(function(data) {
  console.log(`🚀 Server ready at ${data.url}`);
});

测试

启动服务

node server.js

服务启动后,访问 http://localhost:4000 进行测试。

变更操作

变更请求

mutation createUser($user: UserInput!) {
  createUser(user: $user) {
    id,
    name,
    email
  }
}

变更参数

{
  "user": {
    "name": "newuser",
    "email": "newuser@gmail.com"
  }
}

操作结果

{
  "data": {
    "createUser": {
      "id": "4",
      "name": "newuser",
      "email": "newuser@gmail.com"
    }
  }
}

相关推荐

  1. GraphQL入门变更输入类型

    2024-03-26 05:36:14       42 阅读
  2. GraphQL入门自定义标量类型

    2024-03-26 05:36:14       41 阅读
  3. GraphQL入门使用ApolloServer和express构建GraphQL服务

    2024-03-26 05:36:14       48 阅读
  4. GraphQL入门查询指令Directive

    2024-03-26 05:36:14       45 阅读
  5. GraphQL入门

    2024-03-26 05:36:14       47 阅读
  6. Go 获取变量类型

    2024-03-26 05:36:14       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 05:36:14       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 05:36:14       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 05:36:14       82 阅读
  4. Python语言-面向对象

    2024-03-26 05:36:14       91 阅读

热门阅读

  1. OpenCV图像翻转和旋转

    2024-03-26 05:36:14       37 阅读
  2. 使用OpenCV在Qt C++环境中实现车牌号码的识别

    2024-03-26 05:36:14       38 阅读
  3. GraphQL入门之自定义标量类型

    2024-03-26 05:36:14       41 阅读
  4. OpenCV多边形填充与绘制

    2024-03-26 05:36:14       39 阅读
  5. Ubuntu下采用VSCode进行C/C++开发(2)

    2024-03-26 05:36:14       43 阅读
  6. Node.js及node.js常用命令

    2024-03-26 05:36:14       35 阅读
  7. npm install jsencrypt爆错

    2024-03-26 05:36:14       37 阅读
  8. 神经网络深度学习梯度下降算法优化

    2024-03-26 05:36:14       49 阅读
  9. 云安全与云计算的关系

    2024-03-26 05:36:14       47 阅读