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>
相关推荐
QQ1__8115175151 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态1 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子1 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室1 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI1 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing1 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者1 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册1 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李1 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢1 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web