说明:

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

一、添加相关的包

  • yarn add Mongoose

二、初始化Mongodb

  • 修改server.ts
  • 导入 import * as Mongoose from 'mongoose';
  • 添加了方法 mongodbInit()
  • 全部代码如下 :
  •  import * as express from 'express';
    const { graphqlExpress, graphiqlExpress } = require('apollo-server-express')
    const expressPlayground = require('graphql-playground-middleware-express').default;
    import * as Mongoose from 'mongoose';
    var bodyParser = require('body-parser'); import schema from './schema'; class Server {
    public app: express.Application;
    constructor() {
    this.app = express();
    this.routes();
    this.mongodbInit();
    } private routes(): void {
    this.app.use('/graphql',bodyParser.json(), graphqlExpress({ schema }));
    this.app.get('/playground', expressPlayground({ endpoint: '/graphql' }));
    } private mongodbInit() {
    const MONGO_URI = "mongodb://localhost/gqlServer";
    Mongoose.connect(MONGO_URI || process.env.MONGO_URI);
    this.app.use(bodyParser.urlencoded({ extended: false }));
    this.app.use(bodyParser.json());
    }
    } export default new Server().app;

三、修改user文件

  • 添加user.ts代码如下:
  •  import { model, Schema, Document } from 'mongoose';
    
     export interface IUserModel extends Document {
    id:string,
    name: String,
    password: String,
    } let UserSchema: Schema = new Schema({
    name: String,
    password: String,
    createAt: {
    type: Date,
    default: new Date(),
    required: true
    },
    updateAt: {
    type: Date,
    default: new Date(),
    required: true
    },
    }) 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代码
  •  type Role{
    id:String
    roleName:String
    } extend type Query {
    # 查找所有角色
    getRoles: [Role]
    } extend type Mutation {
    # 创建角色| 修改角色
    saveRole(role:inputRole):Role
    } input inputRole{
    id:String
    roleName:String
    }
  • role.ts代码
  •  import { model, Schema, Document } from 'mongoose';
    
     export interface IRoleModel extends Document {
    id:string,
    roleMame: String,
    } let RoleSchema: Schema = new Schema({
    roleMame: String,
    createAt: {
    type: Date,
    default: new Date(),
    required: true
    },
    updateAt: {
    type: Date,
    default: new Date(),
    required: true
    },
    }) export default model<IRoleModel>('Role', RoleSchema);
  • resolver.ts 代码
  •  import RoleSchema, { IRoleModel } from './role';
    
     export class Role {
    constructor() { } static Query: any = {
    getRoles(parent, { }, context) {
    return RoleSchema.find();
    }
    } static Mutation: any = {
    saveRole(parent, { role }, context) {
    return RoleSchema.create(role)
    }
    } }
  • 导入resolver到resolvers.ts代码如下:
  •  import { User } from "./user/resolver";
    import { Role } from "./role/resolver"; export default {
    Query: {
    ...User.Query,
    ...Role.Query
    },
    Mutation: {
    ...User.Mutation,
    ...Role.Mutation
    },
    };
  • 导入role.gql 到src/schema.ts 代码如下:
  •  import { makeExecutableSchema } from 'graphql-tools';
    import resolver from "./resolvers";
    var requireText = require('require-text');
    var Base = requireText('./base.gql', require);
    var User = requireText('./user/user.gql', require);
    var Role = requireText('./role/role.gql', require); //添加了角色 //基础信息
    var typeDefs = [Base];
    typeDefs = typeDefs.concat(User);
    typeDefs = typeDefs.concat(Role); const schema = makeExecutableSchema({
    typeDefs: typeDefs,
    resolvers: resolver
    }) export default schema; 
  • 运行可以看到相关表,尝试添加一个角色,和查找一下

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

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

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

  • user.gql
  •  # 系统用户表
    type User {
    id: ID!
    # 用户登录名
    username: String
    # 姓名
    name: String
    # 邮件
    email:String
    # 密码
    password:String
    # 创建时间
    createAt:Date
    # 修改时间
    updateAt:Date
    #用户角色
    Role:Role
    #是否有效
    isValid:Boolean
    #用户资料
    Profile:Profile
    } extend type Query {
    # 查找所有用户
    getUsers: [User]
    # 根据ID查找用户
    getUserById(id:String):User
    # 分页查找
    getUserPage(pageIndex: Int, pageSize: Int,user:searchUser): [User]
    # 查找分页总数
    getUserCount(user:searchUser):Int
    # 根据条件查找
    getUserWhere(user:searchUser): [User]
    # 用户登录
    login (username:String!,password:String!): User
    # 用户退出
    logOut:Boolean,
    #当前登录用户
    currentUser:User } extend type Mutation {
    # 创建用户|修改用户
    saveUser(user:inputUser):User
    # 删除用户
    deleteUser(id:String):Boolean
    } input inputUser{
    id:String
    username: String
    name: String
    email:String
    password:String
    roleId:String
    profileId:String
    isValid:Boolean
    } input searchUser{
    username:Json
    roleId:Json
    email:Json
    name:Json
    }
  • resolver.ts
     import UserSchema, { IUserModel } from './user';
    import RoleSchema from '../role/role';
    import ProfileSchema from '../profile/profile'; import { DocumentQuery, MongoosePromise } from 'mongoose'; export class User { constructor() {
    } static User: any = {
    Role(model) {
    return RoleSchema.findById(model.roleId);
    },
    Profile(model) {
    return ProfileSchema.findOne({ userId: model.id });
    }
    } static Query: any = {
    getUsers(parent, __, context): Promise<Array<IUserModel>> {
    //if (!context.user) return null;
    let promise = new Promise<Array<IUserModel>>((resolve, reject) => {
    UserSchema.find().then(res => {
    resolve(res);
    }).catch(err => resolve(null));
    });
    return promise;
    }, getUserById(parent, { id }, context): Promise<IUserModel> {
    //if (!context.user) return null; let promise = new Promise<IUserModel>((resolve, reject) => {
    UserSchema.findById(id).then(res => {
    resolve(res);
    }).catch(err => resolve(null));
    });
    return promise;
    }, getUserPage(parent, { pageIndex = 1, pageSize = 10, user }, context) {
    //if (!context.user) return null;
    var skip = (pageIndex - 1) * pageSize
    var userInfo = UserSchema.find(user).skip(skip).limit(pageSize)
    return userInfo;
    }, getUserWhere(parent, { user }, context) {
    //if (!context.user) return null;
    console.log(user);
    var users = UserSchema.find(user);
    return users;
    }, getUserCount(parent, { user }, context) {
    //if (!context.user) return 0;
    var count = UserSchema.count(user);
    return count;
    }, login(parent, { username, password }, context) {
    return new Promise<any>((resolve, reject) => {
    UserSchema.find({ username, password }).then(data => {
    if (data.length > 0) {
    var user=data[0];
    context.session.user = user;
    resolve(user);
    } else {
    context.session.user = null;
    resolve(null);
    }
    })
    })
    },
    logOut(parent, { }, context) {
    context.user = null;
    context.session.user = null;
    return true;
    },
    currentUser(parent, { }, context) {
    //if (!context.user) return null;
    let promise = new Promise<IUserModel>((resolve, reject) => {
    let user = context.user;
    if (user) {
    UserSchema.findById(user._id).then(res => {
    resolve(res);
    }).catch(err => resolve(null));
    } else {
    resolve(null);
    }
    });
    return promise; },
    } static Mutation: any = {
    saveUser(parent, { user }, context) {
    //正式运行时请取消注释
    // if (!context.user) return null;
    if (user.id && user.id != "0") {
    return new Promise<IUserModel>((resolve, reject) => {
    UserSchema.findByIdAndUpdate(user.id, user, (err, res) => {
    Object.assign(res, user);
    resolve(res);
    })
    });
    }
    return UserSchema.create(user)
    }, deleteUser(parent, { id }, context): Promise<Boolean> {
    //if (!context.user) return null;
    let promise = new Promise<Boolean>((resolve, reject) => {
    UserSchema.findByIdAndRemove(id, (err, res) => {
    resolve(res != null)
    }).catch(err => reject(err));
    });
    return promise;
    }
    }
    }

graphql 数据增删改查分页及关联操作(三)的更多相关文章

  1. IOS-CoreData(增删改查、表关联、分页和模糊查询、多个数据库)

    1>什么是CoreData Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数 ...

  2. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  3. salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的标签相对简单,如果需要深入了解VF相关知识以及标签, 可以通过以下链接查看或下载 ...

  4. node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...

  5. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  6. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  7. C#操作Excel数据增删改查示例

    Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...

  8. SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)

    前言 说起整合自然离开ssm,我本身并不太喜欢ORM,尤其是MyBatis,把SQL语句写在xml里,尤其是大SQL,可读性不高,出错也不容易排查. 开发环境 idea2016.SpringMVC4. ...

  9. C#在winform中操作数据库,实现数据增删改查

    1.前言: 运行环境:VS2013+SQL2008+Windows10 程序界面预览: 使用的主要控件:dataGridview和menuStrip等. 2.功能具体介绍: 1.首先,我们要先实现基本 ...

随机推荐

  1. P4345 [SHOI2015]超能粒子炮·改

    传送门 看到数据和模数大小就知道要上 lucas 了 然后开始愉快地推公式: 答案为 $\sum _{i=0}^kC_{n}^{i}\ (mod\ 2333)$ 设 $f [ i ] [ j ] = ...

  2. CF 520 B. Two Buttons(bfs)

    /*题意:一个数,就是输入的第一个数,让它变成第二个数最少用几步.可以点红色按钮,蓝色按钮来改变数字,红色:*2,蓝色:-1,如果变成负数,就变成原来的数.CF 520 B. Two Buttons思 ...

  3. Postman如何做接口测试

    Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用. 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据, ...

  4. sqoop导入数据

    来源https://www.cnblogs.com/qingyunzong/p/8807252.html 一.概述 sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据 ...

  5. 判断元素类型JS

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. PlayMaker 做成预制体

    把包含PlayMaker状态机的游戏物体做成预制体后,再编辑PlayMaker状态机的时候,会有两个选项 * Edit Prefab :编辑完成后预制体的PlayMaker状态机也会改变: * Edi ...

  7. /proc/sys/net/ipv4/下各参数含义

    net.ipv4.tcp_tw_reuse = 0 表示开启重用.允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 net.ipv4.tcp_tw_recycle = ...

  8. RedHat7配置静态IP

    1.验证网络管理器状态,Active: active (running)表示正在运行,一般RHEL7都默认安装了. [root@localhost ~]# systemctl status Netwo ...

  9. vue脚手架 && 实例

    什么是vue脚手架? 即可以快速构建vue项目的工具,通过它,我们可以将vue项目所需要的文件等安装完成. 为什么要是用vue脚手架,优点何在? 因为创建一个vue项目需要很多的依赖,文件的设置等,而 ...

  10. MATLAB线性回归方程与非线性回归方程的相关计算

    每次比赛都需要查一下,这次直接总结到自己的博客中. 以这个为例子: 2.线性方程的相关计算 x=[1,2,3,4,5]';%参数矩阵 X=[ones(5,1),x];%产生一个5行一列的矩阵,后接x矩 ...