graphql 数据增删改查分页及关联操作(三)

说明:

  • 接第二篇文章,代码也是在第二篇文章之上
  • 本文只是针对mondodb来操作

一、添加相关的包

  • yarn add Mongoose

二、初始化Mongodb

  • 修改server.ts
  • 导入 import * as Mongoose from 'mongoose';
  • 添加了方法 mongodbInit()
  • 全部代码如下 :
  •  1 import * as express from 'express';
     2 const { graphqlExpress, graphiqlExpress } = require('apollo-server-express')
     3 const expressPlayground = require('graphql-playground-middleware-express').default;
     4 import * as Mongoose from 'mongoose';
     5 var bodyParser = require('body-parser');
     6 
     7 import schema from './schema';
     8 
     9 class Server {
    10     public app: express.Application;
    11     constructor() {
    12         this.app = express();
    13         this.routes();
    14         this.mongodbInit();
    15     }
    16 
    17     private routes(): void {
    18         this.app.use('/graphql',bodyParser.json(), graphqlExpress({ schema }));
    19         this.app.get('/playground', expressPlayground({ endpoint: '/graphql' }));
    20     }
    21     
    22     private mongodbInit() {
    23         const MONGO_URI = "mongodb://localhost/gqlServer";
    24         Mongoose.connect(MONGO_URI || process.env.MONGO_URI);
    25         this.app.use(bodyParser.urlencoded({ extended: false }));
    26         this.app.use(bodyParser.json());
    27     } 
    28 }
    29 
    30 export default new Server().app;

三、修改user文件

  • 添加user.ts代码如下:
  •  1 import { model, Schema, Document } from 'mongoose';
     2 
     3 export interface IUserModel extends Document {
     4     id:string,
     5     name: String,
     6     password: String,
     7 }
     8 
     9 let UserSchema: Schema = new Schema({
    10     name: String,
    11     password: String, 
    12     createAt: {
    13         type: Date,
    14         default: new Date(),
    15         required: true 
    16     },
    17     updateAt: {
    18         type: Date,
    19         default: new Date(),
    20         required: true
    21     },
    22 })
    23 
    24 export default model<IUserModel>('User', UserSchema);
  • 修改resolver.ts代码如下:
  • import UserSchema, { IUserModel } from './user';
    
    export class User {
        constructor() {
    
        }
    
        static Query: any = {
            getUsers(parent, { }, context) {
                return UserSchema.find();
            }
        }
    
        static Mutation: any = {
            saveUser(parent, { user }, context) {
                return UserSchema.create(user)
            }
        }
    
    }

四、运行项目 yarn start 打开地址http://localhost:8080/playground应该可以添加用户和查找用户了效果如下:

、增删改查相关的方法可以自己去扩展

六、关联

  • 添加角色文件夹role/role.gql,role/resolve,role/resolver.ts
  • 代码基本可以复制user里面的代码改相关的名字
  • 项目结构
  • role.gql代码
  •  1 type Role{
     2     id:String
     3     roleName:String
     4 }
     5 
     6 
     7 extend type Query {
     8     # 查找所有角色
     9     getRoles: [Role]
    10 }
    11 
    12 extend type Mutation {
    13     # 创建角色| 修改角色
    14     saveRole(role:inputRole):Role
    15 }
    16 
    17 input inputRole{
    18     id:String
    19     roleName:String
    20 }
  • role.ts代码
  •  1 import { model, Schema, Document } from 'mongoose';
     2 
     3 export interface IRoleModel extends Document {
     4     id:string,
     5     roleMame: String,
     6 }
     7 
     8 let RoleSchema: Schema = new Schema({
     9     roleMame: String,
    10     createAt: {
    11         type: Date,
    12         default: new Date(),
    13         required: true 
    14     },
    15     updateAt: {
    16         type: Date,
    17         default: new Date(),
    18         required: true
    19     },
    20 })
    21 
    22 export default model<IRoleModel>('Role', RoleSchema);
  • resolver.ts 代码
  •  1 import RoleSchema, { IRoleModel } from './role';
     2 
     3 export class Role {
     4     constructor() {
     5 
     6     }
     7 
     8     static Query: any = {
     9         getRoles(parent, { }, context) {
    10             return RoleSchema.find();
    11         }
    12     }
    13 
    14     static Mutation: any = {
    15         saveRole(parent, { role }, context) {
    16             return RoleSchema.create(role)
    17         }
    18     }
    19 
    20 }
  • 导入resolver到resolvers.ts代码如下:
  •  1 import { User } from "./user/resolver";
     2 import { Role } from "./role/resolver";
     3 
     4 export default {
     5     Query: {
     6         ...User.Query,
     7         ...Role.Query
     8     },
     9     Mutation: {
    10         ...User.Mutation,
    11         ...Role.Mutation
    12     },
    13 };
  • 导入role.gql 到src/schema.ts 代码如下:
  •  1 import { makeExecutableSchema } from 'graphql-tools';
     2 import resolver from "./resolvers";
     3 var requireText = require('require-text');
     4 var Base = requireText('./base.gql', require);
     5 var User = requireText('./user/user.gql', require);
     6 var Role = requireText('./role/role.gql', require); //添加了角色 
     7 
     8 
     9 //基础信息
    10 var typeDefs = [Base];
    11 typeDefs = typeDefs.concat(User);
    12 typeDefs = typeDefs.concat(Role);
    13 
    14 const schema = makeExecutableSchema({
    15   typeDefs: typeDefs,
    16   resolvers: resolver
    17 })
    18 
    19 
    20 export default schema; 
  • 运行可以看到相关表,尝试添加一个角色,和查找一下

七、关联用户与角色,基本关系,每一个用户有一个角色1对1

  • 修改文件user.gql代码如下:
  •  1 type User{
     2     id:String
     3     name:String
     4     passwrod:String
     5     # 添加了role字段
     6     Role:Role 
     7 }
     8 
     9 
    10 extend type Query {
    11     # 查找所有用户
    12     getUsers: [User]
    13 }
    14 
    15 extend type Mutation {
    16     # 创建用户|修改用户
    17     saveUser(user:inputUser):User
    18 }
    19 
    20 input inputUser{
    21     id:String
    22     name:String
    23     passwrod:String
    24     # 添加了roleid
    25     roleId:String
    26 }
  • 修改user.ts文件代码如下:
  •  1 import { model, Schema, Document } from 'mongoose';
     2 
     3 export interface IUserModel extends Document {
     4     id:string,
     5     name: String,
     6     passwrod: String,
     7     roleId: String,//只是添加了这里
     8 }
     9 
    10 let UserSchema: Schema = new Schema({
    11     name: String,
    12     passwrod: String, 
    13     roleId: String, //只是添加了这里
    14     createAt: {
    15         type: Date,
    16         default: new Date(),
    17         required: true 
    18     },
    19     updateAt: {
    20         type: Date,
    21         default: new Date(),
    22         required: true
    23     },
    24 })
    25 
    26 export default model<IUserModel>('User', UserSchema);
  • 修改user/resolver.ts文件代码如下:
  •  1 import UserSchema, { IUserModel } from './user';
     2 import RoleSchema from '../role/role';
     3 
     4 export class User {
     5     constructor() {
     6 
     7     }
     8 
     9     //只是添加用户的角色
    10     static User: any = {
    11         Role(model) {
    12             return RoleSchema.findById(model.roleId);
    13         },
    14     }
    15 
    16     static Query: any = {
    17         getUsers(parent, { }, context) {
    18             return UserSchema.find();
    19         }
    20     }
    21 
    22     static Mutation: any = {
    23         saveUser(parent, { user }, context) {
    24             return UserSchema.create(user)
    25         }
    26     }
    27 
    28 }
  • 导入用户角色到resolver.ts代码如下:
  •  1 import { User } from "./user/resolver";
     2 import { Role } from "./role/resolver";
     3 
     4 export default {
     5     Query: {
     6         ...User.Query,
     7         ...Role.Query
     8     },
     9     Mutation: {
    10         ...User.Mutation,
    11         ...Role.Mutation
    12     },
    13     User:User.User //只是添加了这一行
    14 };
  • 运行,添加一个角色,根据角色id添加用户,页面查询应该可以看到以下结果:

八,相关的增加修改删除分页代码参考下面代码:

  • user.gql
  •  1 # 系统用户表
     2 type User {
     3     id: ID!
     4     # 用户登录名
     5     username: String
     6     # 姓名
     7     name: String
     8     # 邮件
     9     email:String
    10     # 密码
    11     password:String
    12     # 创建时间
    13     createAt:Date
    14     # 修改时间
    15     updateAt:Date
    16     #用户角色
    17     Role:Role
    18     #是否有效
    19     isValid:Boolean
    20     #用户资料
    21     Profile:Profile
    22 }
    23 
    24 extend type Query {
    25     # 查找所有用户
    26     getUsers: [User]
    27     # 根据ID查找用户
    28     getUserById(id:String):User
    29     # 分页查找
    30     getUserPage(pageIndex: Int, pageSize: Int,user:searchUser): [User]
    31     # 查找分页总数
    32     getUserCount(user:searchUser):Int
    33     # 根据条件查找
    34     getUserWhere(user:searchUser): [User]
    35     # 用户登录
    36     login (username:String!,password:String!): User
    37     # 用户退出
    38     logOut:Boolean,
    39     #当前登录用户
    40     currentUser:User
    41    
    42 }
    43 
    44 extend type Mutation {
    45     # 创建用户|修改用户
    46     saveUser(user:inputUser):User
    47      # 删除用户
    48     deleteUser(id:String):Boolean
    49 }
    50 
    51 input inputUser{
    52     id:String
    53     username: String
    54     name: String
    55     email:String
    56     password:String
    57     roleId:String
    58     profileId:String
    59     isValid:Boolean
    60 }
    61 
    62 input searchUser{
    63     username:Json
    64     roleId:Json
    65     email:Json
    66     name:Json
    67 }
    View Code
  • resolver.ts
      1 import UserSchema, { IUserModel } from './user';
      2 import RoleSchema from '../role/role';
      3 import ProfileSchema from '../profile/profile';
      4 
      5 
      6 import { DocumentQuery, MongoosePromise } from 'mongoose';
      7 
      8 export class User {
      9 
     10 
     11     constructor() {
     12     }
     13 
     14     static User: any = {
     15         Role(model) {
     16             return RoleSchema.findById(model.roleId);
     17         },
     18         Profile(model) {
     19             return ProfileSchema.findOne({ userId: model.id });
     20         }
     21     }
     22 
     23     static Query: any = {
     24         getUsers(parent, __, context): Promise<Array<IUserModel>> {
     25             //if (!context.user) return null;
     26             let promise = new Promise<Array<IUserModel>>((resolve, reject) => {
     27                 UserSchema.find().then(res => {
     28                     resolve(res);
     29                 }).catch(err => resolve(null));
     30             });
     31             return promise;
     32         },
     33 
     34         getUserById(parent, { id }, context): Promise<IUserModel> {
     35             //if (!context.user) return null;
     36 
     37             let promise = new Promise<IUserModel>((resolve, reject) => {
     38                 UserSchema.findById(id).then(res => {
     39                     resolve(res);
     40                 }).catch(err => resolve(null));
     41             });
     42             return promise;
     43         },
     44 
     45         getUserPage(parent, { pageIndex = 1, pageSize = 10, user }, context) {
     46             //if (!context.user) return null;
     47             var skip = (pageIndex - 1) * pageSize
     48             var userInfo = UserSchema.find(user).skip(skip).limit(pageSize)
     49             return userInfo;
     50         },
     51 
     52         getUserWhere(parent, { user }, context) {
     53             //if (!context.user) return null;
     54             console.log(user);
     55             var users = UserSchema.find(user);
     56             return users;
     57         },
     58 
     59         getUserCount(parent, { user }, context) {
     60             //if (!context.user) return 0;
     61             var count = UserSchema.count(user);
     62             return count;
     63         }, 
     64 
     65         login(parent, { username, password }, context) {
     66             return new Promise<any>((resolve, reject) => {
     67                 UserSchema.find({ username, password }).then(data => {
     68                     if (data.length > 0) {
     69                         var user=data[0];
     70                         context.session.user = user;
     71                         resolve(user);
     72                     } else {
     73                         context.session.user = null;
     74                         resolve(null);
     75                     }
     76                 })
     77             })
     78         },
     79         logOut(parent, { }, context) {
     80             context.user = null;
     81             context.session.user = null;
     82             return true;
     83         },
     84         currentUser(parent, { }, context) {
     85             //if (!context.user) return null;
     86             let promise = new Promise<IUserModel>((resolve, reject) => {
     87                 let user = context.user;
     88                 if (user) {
     89                     UserSchema.findById(user._id).then(res => {
     90                         resolve(res);
     91                     }).catch(err => resolve(null));
     92                 } else {
     93                     resolve(null);
     94                 }
     95             });
     96             return promise;
     97 
     98         },
     99     }
    100 
    101     static Mutation: any = {
    102         saveUser(parent, { user }, context) {
    103             //正式运行时请取消注释
    104             // if (!context.user) return null;
    105             if (user.id && user.id != "0") {
    106                 return new Promise<IUserModel>((resolve, reject) => {
    107                     UserSchema.findByIdAndUpdate(user.id, user, (err, res) => {
    108                         Object.assign(res, user);
    109                         resolve(res);
    110                     })
    111                 });
    112             }
    113             return UserSchema.create(user)
    114         },
    115 
    116         deleteUser(parent, { id }, context): Promise<Boolean> {
    117             //if (!context.user) return null;
    118             let promise = new Promise<Boolean>((resolve, reject) => {
    119                 UserSchema.findByIdAndRemove(id, (err, res) => {
    120                     resolve(res != null)
    121                 }).catch(err => reject(err));
    122             }); 
    123             return promise;
    124         }
    125     }
    126 }
    View Code
原文地址:https://www.cnblogs.com/lslgg/p/8178700.html