express graphql增删改查

app.ts

TypeScript 复制代码
import express, { Request, Response } from "express";
import { createHandler } from "graphql-http/lib/use/express";
import { buildSchema } from "graphql";
import { ruruHTML } from "ruru/server";
import cors from "cors";
import fs from "fs";
import path from "path";

// Int,Float,String,Boolean,ID
var schema = buildSchema(`
  #复杂对象类型
  type Article {
    id: ID
    title: String
    content: String
  }

  #复杂对象类型
  type User {
    id: ID
    name: String
    age: Int
    salary: Float
    articles: [Article] #数组
  }

  #查询列表,可查询数据名称类型
  #默认每个数据可以为空
  #加!不可以为空
  type Query {
    hello: String!
    foo: String!
    count: Int!
    salary: Float!
    isGood: Boolean
    userId: ID
    user: User
    tag: [String!]!
    #条件查询
    article(id: ID!, title: String): [Article]!
  }

  #参数类型
  input CreateArticleParams {
    title: String!
    content: String!
  }

  input UpdateArticleParams {
    id: ID
    title: String!
    content: String!
  }

  # 复杂数据类型
  type DeletionStatus {
    success: Boolean!
  }

  #修改入口点
  type Mutation {
    #createArticle(title: String!, content: String!): Article
    createArticle(params: CreateArticleParams): Article
    updateArticle(params: UpdateArticleParams): Boolean 
    deleteArticle(id: ID!): DeletionStatus
  }
`);

// resolver,对应schema中Query,Mutation进行处理
var root = {
  hello() {
    return "Hello world!"
  },
  foo() {
    return "foo";
  },
  count() {
    return 10;
  },
  salary() {
    return 14000.5;
  },
  isGood() {
    return true;
  },
  userId() {
    return '123456';
  },
  tag() {
    return ['ABC', 'DEF', 'GHI', 'JKL'];
  },
  user() {
    return {
      id: 'asdqwasdasd',
      name: 'String',
      age: 24,
      salary: 16000,
      articles: [
        { id: "12sdadasd", title: "abcdefg", content: "aaaaaaaaa" },
        { id: "asdsdqwe2", title: "abcdefg", content: "aaaaaaaaa" },
        { id: "qwee2qwe2", title: "abcdefg", content: "aaaaaaaaa" },
      ]
    }
  },
  // 条件查询
  article(args: { id: string }) {
    // console.log(args);
    return [
      { id: "12sdadasd", title: "abcdefg", content: "aaaaaaaaa" },
      { id: "asdsdqwe2", title: "abcdefg", content: "aaaaaaaaa" },
      { id: "qwee2qwe2", title: "abcdefg", content: "aaaaaaaaa" },
    ].filter(item => item.id === args.id);
  },
  // 添加,修改,删除
  createArticle({ params: { title, content } }: { params: { title: string, content: string } }) {
    console.log(title, content);
    return { id: "mokasdno", title, content };
  },
  updateArticle({ params }: { params: { [key: string]: string } }) {
    console.log(params);
    return true;
  },
  deleteArticle({ id }: { id: string }) {
    console.log(id);
    return { success: true };
  }
}

var app = express();

app.use(cors());

app.use(express.static(path.join(__dirname, 'public')));

app.all(
  "/graphql",
  createHandler({
    schema: schema,
    rootValue: root
  })
);

// Serve the GraphiQL IDE.
app.get("/", (_req: Request, res: Response) => {
  res.type("html")
  res.end(ruruHTML({ endpoint: "/graphql" }))
});

app.get('/index', (_req: Request, res: Response) => {
  res.type("html");
  res.end(fs.readFileSync(path.resolve(__dirname, './index.html'), 'utf-8'));
});

// Start the server at port
app.listen(4000, () => {
  console.log("Running a GraphQL API server at http://localhost:4000/graphql");
});

index.html

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="shortcut icon" href="react.svg" type="image/x-icon">
  <script src="https://cdn.staticfile.net/axios/1.6.5/axios.min.js"></script>
  <script src="https://cdn.staticfile.net/axios/1.6.5/axios.min.js.map"></script>
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 普通查询
  axios({
    method: "POST",
    url: "http://localhost:4000/graphql",
    data: {
      // query: '{ foo, hello, count, salary, isGood, userId, tag, user{ name, age, articles { title, content } } }'
      query: 'query SearchData { foo, hello, count, salary, isGood, userId, tag, user{ name, age, articles { title, content } } }'
    }
  }).then(res => {
    if (res.data?.data) {
      console.log(res.data.data);
    } else {
      console.log(JSON.stringify(res.data.errors));
    }
  }).catch(err => {
    console.log(err);
  });

  // 条件查询
  axios({
    method: "POST",
    url: "http://localhost:4000/graphql",
    data: {
      // query: '{ article(id: "qwee2qwe2", title: "abcdefg") { id, title, content } }'
      // query: 'query asdadxc { article(id: "qwee2qwe2", title: "abcdefg") { id, title, content } }',
      query: 'query asdadxc($id: ID!, $title: String) { article(id: $id, title: $title) { id, title, content } }',
      // 使用variables进行字符串替换,免字符串拼接
      variables: {
        id: "qwee2qwe2",
        title: "abcdefg"
      }
    }
  }).then(res => {
    if (res.data?.data) {
      console.log(res.data.data);
    } else {
      console.log(JSON.stringify(res.data.errors));
    }
  }).catch(err => {
    console.log(err);
  });

  // 添加
  axios({
    method: "POST",
    url: "http://localhost:4000/graphql",
    data: {
      // query: 'mutation { createArticle(title: "abcdef", content: "texttttttt"){id,title,content} }'
      // query: 'mutation { createArticle(params: { title: "abcdef", content: "texttttttt" }){id,title,content} }'
      // query: 'mutation adasds { createArticle(params: { title: "abcdef", content: "texttttttt" }){id,title,content} }'
      query: `mutation asdasdsdd($create: CreateArticleParams) {
        createArticle(params: $create){
          id, title, content
        } 
      }`,
      variables: {
        create: {
          title: "abcdefg",
          content: "texttttttt"
        }
      }
    }
  }).then(res => {
    if (res.data?.data) {
      console.log(res.data.data);
    } else {
      console.log(JSON.stringify(res.data.errors));
    }
  }).catch(err => {
    console.log(err);
  });

  // 修改
  axios({
    method: "POST",
    url: "http://localhost:4000/graphql",
    data: {
      // query: 'mutation { createArticle(title: "abcdef", content: "texttttttt"){id,title,content} }'
      // query: 'mutation { createArticle(params: { title: "abcdef", content: "texttttttt" }){id,title,content} }'
      // query: 'mutation adasds { updateArticle(params: { id:"asdasdsad",title: "abcdef", content: "texttttttt" }) }'
      query: 'mutation lalalalala($update: UpdateArticleParams) { updateArticle(params: $update) }',
      variables: {
        update: {
          id: "asdasdsad",
          title: "abcdefg",
          content: "texttttttt"
        }
      }
    }
  }).then(res => {
    if (res.data?.data) {
      console.log(res.data.data);
    } else {
      console.log(JSON.stringify(res.data.errors));
    }
  }).catch(err => {
    console.log(err);
  });

  // 删除
  axios({
    method: "POST",
    url: "http://localhost:4000/graphql",
    data: {
      // query: 'mutation { createArticle(title: "abcdef", content: "texttttttt"){id,title,content} }'
      // query: 'mutation { createArticle(params: { title: "abcdef", content: "texttttttt" }){id,title,content} }'
      // query: 'mutation adasds { deleteArticle(id: "asdasdsad"){ success } }'
      query: 'mutation adasds($id: ID!) { deleteArticle(id: $id){ success } }',
      variables: {
        id: "asdasdsad",
      }
    }
  }).then(res => {
    if (res.data?.data) {
      console.log(res.data.data);
    } else {
      console.log(JSON.stringify(res.data.errors));
    }
  }).catch(err => {
    console.log(err);
  });

  // 同时执行多个修改
  axios({
    method: "POST",
    url: "http://localhost:4000/graphql",
    data: {
      query: `
      mutation adasds($id: ID!, $update: UpdateArticleParams, $create: CreateArticleParams) {
        deleteArticle(id: $id){
          success
        }
        createArticle(params: $create){
          id, title, content
        } 
        updateArticle(params: $update)
      }
      `,
      variables: {
        id: "asdasdsad",
        update: {
          id: "asdasdsad",
          title: "abcdefg",
          content: "texttttttt"
        },
        create: {
          title: "abcdefg",
          content: "texttttttt"
        }
      }
    }
  }).then(res => {
    if (res.data?.data) {
      console.log(res.data.data);
    } else {
      console.log(JSON.stringify(res.data.errors));
    }
  }).catch(err => {
    console.log(err);
  });

</script>

</html>
相关推荐
浏览器爱好者2 分钟前
如何在AWS上部署一个Web应用?
前端·云计算·aws
xiao-xiang18 分钟前
jenkins-通过api获取所有job及最新build信息
前端·servlet·jenkins
C语言魔术师35 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
匹马夕阳2 小时前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?2 小时前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
桂月二二8 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
hunter2062069 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb9 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角9 小时前
CSS 颜色
前端·css
九酒10 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae