graphql(三)——graphql+node+express+mongodb实现增删改查

欧阳翔
2023-12-01

接着上节学习graphql+node+express+mongodb实现增删改查及两表关联

先定义schema

以集合user为例子:

  • graphql中定义schema(schema.js)
    type User{
         name:String,
         age:Int,
         id:String,
         status:String,
         msg:String
     }
     
     type Query {
         getUser:[User]
     }
    
     type Mutation{
         createUser(argsMutify:MutifyUser):User
         updateUser(argsMutify:MutifyUser):User
         deleteUser(id:String):User
     }
    
    input MutifyUser{
        name:String,
        age:Int,
        status:String,
        msg:String,
        id:String
    }
    
  • 数据库中(models/user.js)
    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    
    var userSchema = new Schema({
      name: String,
      age: Number
    });
    
    module.exports = mongoose.model("user", userSchema)
    

resolver

  • getUser() {
    	return User.find();   //User是在resolver文件中引入的集合
    }
    
  • async createUser(root, {
       argsMutify
    }) {
        let newData = {};
        await User.findOne({   //在User集合中查找增加的数据是否存在
            "name": argsMutify.name
        }).then(async (dataUser) => {
            if (!dataUser) {
                await User.insertMany(argsMutify)
                    .then((data) => {
                        newData = data[0];
                    });
                newData.status = 200;
                newData.msg = "增加成功!"
            } else {
                newData.status = 403;
                newData.msg = "增加失败,数据已存在!"
            }
        });
        return newData;
    }
    
  • async updateUser(root, {
       argsMutify
    }) {
        let newData;
        await User.findByIdAndUpdate({
            _id: argsMutify.id
        }, {
            $set: {
                name: argsMutify.name,
                age: argsMutify.age
            }
        }, {
            new: true      //加上此句返回的数据是修改之后的,否则返回的是修改之前的
        }).then((data) => {
            if (data) {
                newData = data;
                newData.status = 200;
                newData.msg = "编辑成功!"
            } else {
                newData.status = 403;
                newData.msg = "编辑失败!"
            }
    
        })
        return newData
    }
    
  • async deleteUser(root, {
       id
    }) {
        let newData = {};
         await User.deleteOne({
            "_id": id
        }).then((data) => {
            newData.status = 200;
            newData.msg = "删除成功!"
        })
        return newData
    }
    

表关联

以两个表(userpost)之间的关联为例子(user集合中的id与post集合中的author关联),所以在上面的schema中加入定义集合post的内容。两表关联用populateaggregate 2种方法,但是后者关联时拿不到数据,所以采用前者关联表,在使用之前先得了解populate的语法,若会用populate的可以直接进入下面步骤:

  • graphql中定义schema
    type Post{
        title: String,
        content: String,
        id:String,
        author:User,
        msg:String,
        status:String
    }
    
    type Query {
       getPost(author:String):Post
    }
    
    type Mutation{
       createPost(argsMutify:MutifyPost):Post
    }
    
    input MutifyPost{
        title: String,
        content: String,
        author:String,
        msg:String,
        status:String
    }
    
  • 数据库中model
    • user集合中的model与schema

      var mongoose = require('mongoose');
      var Schema = mongoose.Schema;
      
      var userSchema = new Schema({
        name: String,
        age: Number
      });
      
      module.exports = mongoose.model("user", userSchema)
      
      
    • post集合中的model与schema

      var mongoose = require('mongoose');
      var Schema = mongoose.Schema;
      
      var postSchema = new Schema({
          title: String,
          content: String,
          author: {type: Schema.Types.ObjectId, ref: 'user'}  // ref选项可以告诉Mongoose在填充过程中使用哪种模型,在示例中是User模型。在此处存储的所有_id必须是User模型中的文档_id。
        });
        
      module.exports = mongoose.model("post", postSchema)
      
  • resolver
    • async getPost(root, agrs, context) {
          let message;
          await Post.findOne({
                  "author": agrs.author
              })
              .populate('author', 'name age').exec()
              .then((post) => {
                  message = post;
              });
          return message;
      }
      
    • async createPost(root, {
           argsMutify
       }) {
           let newData={};
          await Post.findOne({
               "author":argsMutify.author
           }).then(async(data)=>{
               if(!data){
                  await Post.insertMany(argsMutify).then((dataPost) => {
                       newData=dataPost[0];
                   })
                   newData.status=200;
                   newData.msg="增加成功!"
               }else{
                   newData.status=403;
                   newData.msg="增加失败,数据已存在!"
               }
           })
           return newData;
       }
      

graphql结合apollo-serve(中间件)、express(快速搭建服务)、mongoDB(数据库)实现增删改查及表关联已已经完成啦 ✌️ ✌️✌️,因为是初次接触,若有问题欢迎在下面指正!

相关链接

 类似资料: