graphql 数据增删改查分页及关联操作(三)
说明:
- 接第二篇文章,代码也是在第二篇文章之上
- 本文只是针对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 数据增删改查分页及关联操作(三)的更多相关文章
- IOS-CoreData(增删改查、表关联、分页和模糊查询、多个数据库)
1>什么是CoreData Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数 ...
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建
VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的标签相对简单,如果需要深入了解VF相关知识以及标签, 可以通过以下链接查看或下载 ...
- node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...
- 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建
salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建 VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...
- C#操作Excel数据增删改查(转)
C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...
- C#操作Excel数据增删改查示例
Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...
- SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)
前言 说起整合自然离开ssm,我本身并不太喜欢ORM,尤其是MyBatis,把SQL语句写在xml里,尤其是大SQL,可读性不高,出错也不容易排查. 开发环境 idea2016.SpringMVC4. ...
- C#在winform中操作数据库,实现数据增删改查
1.前言: 运行环境:VS2013+SQL2008+Windows10 程序界面预览: 使用的主要控件:dataGridview和menuStrip等. 2.功能具体介绍: 1.首先,我们要先实现基本 ...
随机推荐
- 洛谷1541(多维dp)
走格子拿分数,直接弄dp[i]是到了第i格的最大得分可以发现是假的. 于是此题设f[i][j][k][t]代表四种步伐各用了几次可以得到的最大得分,到达的点可以直接算出来,就好转移了. const i ...
- jquery知识点结合使用
1.在页面的某个具有id的element内插入其他element,并给其增加悬浮提示. $('#id').after('<div id='box'></div>'); $('# ...
- tomcat的安装部署
第一步: 先把压缩包拖到知道的目录,解压 tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/ ln -s /usr/local/apache-tomca ...
- [2019BUAA软工]团队项目选择
Team V1 项目分析 写在前面 项目 内容 这个作业属于哪个课程 BUAA2019软件工程 这个作业的要求在哪里 团队项目选择 参考链接 如何提出靠谱的项目建议 NABCD 我们在这个课程的目标是 ...
- testlink数据库访问密码修改
testlink重启后数据库连接不上将会报错 错误:1045 - Access denied for user 'my_db '@'localhost' (using password: YES) 怎 ...
- 8-----BBS论坛
BBS论坛(八) 8.1.发送邮箱验证码功能 (1)cms/resetemail.html {% from 'common/_macros.html' import static %} {% bloc ...
- Vue在单独引入js文件中使用ElementUI的组件
Vue在单独引入js文件中使用ElementUI的组件 问题场景: 我想在vue中的js文件中使用elementUI中的组件,因为我在main.js中引入了element包和它的css,并挂载到了全局 ...
- VIM操作手札
查看帮助手册 [Vim 中文帮助文档] 常用命令及说明 在命令模式下编辑 命令 说明 Ctrl+u 向文件首翻半屏 Ctrl+d 向文件尾翻半屏 Ctrl+f 向文件尾翻一屏 Ctrl+b 向文件首翻 ...
- android studio NDK配置
向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运行示例应用 向现有项目添加 C/C++ 代码 创建新的原生源文件 创建 CMake 构 ...
- PHP算法——生成唯一字符串
经常遇到忘记密码的情况,点击一下忘记密码,然后收到更改密码的链接,连接中往往都会有一段很长而且很乱的字符串.试想一下,如果出现了重复的字符串,那岂不是把别人的密码给重置了? 所以产生唯一数对于网站的安 ...