GraphQL基础使用--mongoDB数据库操作

news2024/11/20 20:29:11

GraphQL

hello world

首先我们要安装好执行GraphQL的环境
因为其是运行在node服务器端的,所以我们要安装
express express-graphql graphql mongoose
安装好后的package.json文件是这个样子的

在这里插入图片描述
其次我们就要开始配置端口为3000的node服务器

const express = require('express')
var app = express()
app.lisiten(3000)

最后 我们结合graphql
完整代码如下

const express = require('express')
const { buildSchema } = require('graphql')
const graphqlHttp = require('express-graphql')

var Schema = buildSchema(`
	type Query {
		hello: String,
		getName: String,
		getAge: Int
	}
`)
//处理器
const root = {
	hello: () => {
		//通过数据库查询
		var str = 'hello world111';
		return str;
	},
	getName: () => {
		return 'kobe';
	},
	getAge: () => {
		return 100;
	},
};

var app = express();

app.use(
	'/graphql',
	graphqlHttp({
		schema: Schema,
		rootValue: root,
		graphiql: true,
	})
);

app.listen(3000);


运行此js文件
访问localhost:3000/graphql

我们就会看到如下页面,输入Query对象里面填写要查找的元素,点击运行就可以查到响应的数据
在这里插入图片描述

types

我们在上面的案例中可以看到
在定义Schema时 要定义类型type
那么数组是怎么定义呢?按照特定值查找又怎么定义呢?或者我们怎么自己定义一个类型呢?
这里的写法与typescript相似
我们可以使用[String] 或 [Int] 定义一个字符串数组或数字数组 我们也可以自己定义一个对象类型

type Film{
	id: Int,
	name: String,
	poster: String,
	price: Int
}
type Query{
	hello: String,
	getName: String,
	getAge: Int,
	getAllNames: [String],
	getAllAges: [Int],
	getAccountInfo: Account,
	getNowplayingList: [Film],
	getFilmDetail(id: Int!): Film
}

当我们使用!时表示此项必须传

完整代码如下

const express = require('express');
const { buildSchema } = require('graphql');
const graphqlHttp = require('express-graphql');

var Schema = buildSchema(`
type Account{
	name: String,
	age: Int,
	location: String
}

type Film{
	id: Int,
	name: String,
	poster: String,
	price: Int
}

type Query{
	hello: String,
	getName: String,
	getAge: Int,
	getAllNames: [String],
	getAllAges: [Int],
	getAccountInfo: Account,
	getNowplayingList: [Film],
	getFilmDetail(id: Int!): Film
}
`);

var fakeDb = [
	{
		id: 1,
		name: '1111',
		poster: 'http://1111',
		price: 100,
	},
	{
		id: 2,
		name: '2222',
		poster: 'http://2222',
		price: 200,
	},
	{
		id: 1,
		name: '3333',
		poster: 'http://3333',
		price: 300,
	},
];

//处理器
const root = {
	hello: () => {
		//通过数据库查询
		var str = 'hello world111';
		return str;
	},
	getName: () => {
		return 'kobe';
	},
	getAge: () => {
		return 100;
	},
	getAllNames: () => {
		return ['xiaohu', 'xiaoming', 'xiaowei'];
	},
	getAllAges: () => {
		return [18, 19, 300];
	},
	getAccountInfo() {
		return {
			name: 'kobe',
			age: 100,
			location: 'hangzhou',
		};
	},
	getNowplayingList() {
		return fakeDb;
	},
	getFilmDetail({ id }) {
		console.log(id);
		return fakeDb.filter((item) => item.id === id)[0];
	},
};
var app = express();
app.use(
	'/graphql',
	graphqlHttp({
		schema: Schema,
		rootValue: root,
		graphiql: true,
	})
);

app.listen(3000);

mutation

我们之前只定义了Query查找 那么怎么进行添加修改与删除呢
如果我们想要添加 就不能使用type 而是要使用input
而修改与删除则是使用Mytation

input FilmInput {
	name: String,
	poster: String,
	price: Int
}
type Mutation {
	createFilm(input: FilmInput): Film,
	updateFilm(id: Int!, input: FilmInput): Film,
	deleteFilm(id: Int!): Int
}

完整代码如下

const express = require('express');
const { buildSchema } = require('graphql');
const graphqlHttp = require('express-graphql');

var Schema = buildSchema(`
type Film {
	id: Int,
	name: String,
	poster: String,
	price: Int
}

input FilmInput {
	name: String,
	poster: String,
	price: Int
}

type Query {
	getNowplayingList: [Film],
}

type Mutation {
	createFilm(input: FilmInput): Film,
	updateFilm(id: Int!, input: FilmInput): Film,
	deleteFilm(id: Int!): Int
}
`);

var fakeDb = [
	{
		id: 1,
		name: '1111',
		poster: 'http://1111',
		price: 100,
	},
	{
		id: 2,
		name: '2222',
		poster: 'http://2222',
		price: 200,
	},
	{
		id: 1,
		name: '3333',
		poster: 'http://3333',
		price: 300,
	},
];

//处理器
const root = {
	getNowplayingList() {
		return fakeDb;
	},
	createFilm({ input }) {
		var obj = { ...input, id: fakeDb.length + 1 };
		fakeDb.push(obj);
		return obj;
	},
	updateFilm({ id, input }) {
		console.log(id, input);
		var current = null;
		fakeDb = fakeDb.map((item) => {
			if (item.id === id) {
				current = { ...item, ...input };
				return { ...item, ...input };
			}
			return item;
		});
		return current;
	},
	deleteFilm({ id }) {
		fakeDb = fakeDb.filter((item) => item.id !== id);
		return 1;
	},
};
var app = express();
app.use(
	'/graphql',
	graphqlHttp({
		schema: Schema,
		rootValue: root,
		graphiql: true,
	})
);

app.listen(3000);

而且我们对于创建 修改 删除 使用的不再是query 而是mutation
在这里插入图片描述

真实数据库操作

上面我们的操作都是针对自己定义的假数据
现在我们对真实数据库操作
首先连接数据库 使用mongoose

var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/suibian',{
	useNewUrlParse: true,
	useUnifiedTopology: true
})

那个suibian是自己填的可以根据自己需要进行修改

var GilmMode = mongoose.model(
	'film',
	new mongoose.Schema({
		name: String,
		poster: String,
		price: Number
	})
)

graphql非常好的一点是 处理器root里面的方法的返回值可以是一个promise对象
而mongoose操作返回的正好是一个promise对象 所以可以直接返回

完整代码如下

const express = require('express');
const { buildSchema } = require('graphql');
const graphqlHttp = require('express-graphql');

//-------------------连接数据库服务----------------------
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/maizuo', {
	useNewUrlParser: true,
	useUnifiedTopology: true,
});

//限制 数据库这个films(集合表) 只能存3个字段
var FilmModel = mongoose.model(
	'film',
	new mongoose.Schema({
		name: String,
		poster: String,
		price: Number,
	})
);

//FilmModel.create
//FilmModel.find
//FilmModel.update
//FilmModel.delete
//-----------------------------------------------------

var Schema = buildSchema(`
type Film {
	id: String,
	name: String,
	poster: String,
	price: Int
}

input FilmInput {
	name: String,
	poster: String,
	price: Int
}

type Query {
	getNowplayingList: [Film],
}

type Mutation {
	createFilm(input: FilmInput): Film,
	updateFilm(id: String!, input: FilmInput): Film,
	deleteFilm(id: String!): Int
}
`);

//处理器
const root = {
	getNowplayingList() {
		return FilmModel.find();
	},
	createFilm({ input }) {
		/*
			1.创建模型
			2.操作数据库
		*/
		//返回一个promise对象
		return FilmModel.create({
			...input,
		});
	},
	updateFilm({ id, input }) {
		return FilmModel.updateOne(
			{
				_id: id,
			},
			{
				...input,
			}
		)
			.then((res) => FilmModel.find({ _id: id }))
			.then((res) => res[0]);
	},
	deleteFilm({ id }) {
		return FilmModel.deleteOne({ _id: id }).then((res) => 1);
	},
};
var app = express();
app.use(
	'/graphql',
	graphqlHttp({
		schema: Schema,
		rootValue: root,
		graphiql: true,
	})
);

app.listen(3000);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode---2.两数之和

目录题目分析链表最终代码实现(内含注释)题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和…

护眼灯对眼睛真的有作用吗?一文了解市面上的护眼灯是否真的管用

我们都知道,现在越来越多的人开始使用护眼台灯照明了,不为别的,只为眼睛健康,所以同样的也有许多人质疑护眼灯是否真的对眼睛有效果,今天就来聊聊护眼灯是否真的有护眼作用。 在我看来,人体眼睛看任何事物…

TS201的通过外部中断IRQ0控制DMA传输(含参考代码)

外部中断控制DMA传输 DMA的原理就不多说了,之前的文章里有写。 电路中的Interrupt Pin ADSP-TS201 EZ-KIT Lite评估板上每片DSP含有4个外部中断(IRQ3–0 ),其中IRQ0接到了一个按键上(SW4和SW5)。 当按键按下时,表现…

西湖论剑 Flagshop 分析复现

前言 比赛时候没能做出来,其实这道题就是一道pwn题。后面与p w n师傅讨论分析EXP分析还原了解题过程。学到了很多,也希望分享给大家。 任意文件读取 抓包或者看源码就会发现有一个SSRF,但是没有权限读flag,测试发现存在一个readf…

全网惟一面向软件测试人员的Python基础教程-为什么要学Python

全网惟一面向软件测试人员的Python基础教程 起点:python软件测试实战宝典》目录 第一章 为什么软件测试人员要学习Python 文章目录全网惟一面向软件测试人员的Python基础教程前言一、Python是什么?二、为什么要学二、测试人员如何学二、怎么从0开始学Py…

旅行路线可视化研究与实现(Java+Android+Eclipse实现的旅游APP)

目 录 1 概论 1 1.1 研究现状 1 1.2 系统开发意义 1 1.3 系统开发背景 2 2 开发环境以及相关技术 5 2.1 Eclipse 5 2.2 Adroid 5 2.2.1 基本概念 5 2.2.2 简介 6 2.2.3 系统架构 6 2.2.4 四大组件 7 2.3 Java语言 7 2.4 SQLite 7 2.4.1 简介 7 2.4.2 架构 7 2.4.3 特点 8 2.5 F…

《Redis 深度历险:核心原理与应用实践》学习

1、Redis的5种基础数据结构 Redis的5种基础数据结构:string (字符串)、list (列表 )、hash (字典)、 set (集合)、zset (有序集合)。 Redis所有的数据结构都以唯一的key字符串作为名称, 然后通…

基于粒子群优化算法的边缘链接用于边缘检测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

艾美捷FLIVO探针:用于细胞活体凋亡检测,助力科研!

细胞凋亡在胚胎发育、造血、免疫系统的成熟以及维护正常组织和器官的细胞恒定与生长平衡,乃至机体衰老方面都起着重要作用。因此,有关凋亡的研究在临床和基础等各个领域已经广泛开展,凋亡细胞的检测方法显得非常重要。 FLIVO(荧光活体)是一种强大的无创检…

首个搭载8MP摄像头的单SoC行泊一体方案来袭,已拿下多家车企定点

行泊一体正在进入前装规模化上车的关键周期,但同时产品的升级战争也在全面爆发。 《高工智能汽车》了解到,国内领先的智能驾驶技术供应商——AutoBrain重磅推出了国内首个搭载800万像素摄像头的单SoC行泊一体方案。据悉,这是全球量产首发搭载…

dubbo消费者访问不到docker里面的生产者

版本 dubbo3.0.7 Docker version 20.10.21, build baeda1f docker zookeeper lastest 背景 一个dubbo的项目,生产者和消费者之间使用zookeeper管理。 现将消者和zookeeper部署到了docker中,二者使用的都是桥接网络。 消费者仍然在idea中编写逻辑。 服…

正片工艺、负片工艺,这两种PCB生产工艺的差异到底是什么?

在前文《什么是加成法、减成法与半加成法?》中,我们提到:减成法仍为当前PCB生产工艺的主流,那么,其中的两大代表工艺——正片工艺、负片工艺,又是怎样的呢? 请看下图: 当然&#xf…

一起用Go做一个小游戏(下)

打包资源使用file2byteslice包我们可以将图片和config.json文件打包进二进制程序中,之后编译生成一个二进制程序。然后拷贝这一个文件即可,不用再拷贝图片和其他配置文件了。golang有很多第三方包可以将打包资源,原理其实很简单——读取资源文…

面试官:使用 RocketMQ 怎么进行灰度发布?

今天来聊一聊 RocketMQ 的灰度方案。 灰度发布是指在黑与白之间,平滑过渡的一种发布方式。在大流量的系统中,如果一次升级改造范围比较大,或者影响内容不太确定,一般会采用切量的方式进行升级,这样可以减少生产变更带…

面试官:MySQL 中 varchar(n) 中 n 最大取值为多少?

前置知识 要回答这个问题,首先我们得先知道 MySQL 存储一条记录的格式长什么样子。 以 Compact 行格式作为例子,它长这样: 可以看到,一条完整的记录分为「记录的额外信息」和「记录的真实数据」两个部分。 这里重点讲讲记录的…

探究L298N模块烧毁的原因

目录 基础介绍 代码思路 基础介绍 L298N电机驱动版主要由两个核心组件构成: L298N 驱动芯片78M05 稳压器型号: L298N封装: Multiwatt15V 描述:电源电压:4.5V~46V 特性:过流保护(OCP);过热保…

在线教程 | 用「网红项目」DeepSOCIAL 进行社交距离监测

By 超神经 内容一览:YOLO v4 是一个实时的、高精度的目标检测模型,本教程将详细讲解如何基于 YOLO v4 和 SORT 算法,实现在多目标条件下的人群距离检测。 关键词:YOLO v4 SORT 多目标检测 新冠疫情爆发初期,「保持…

VSCODE安装ChatGPT插件

zh1:首先在插件商店搜索ChatGPT中文版 然后点击安装就可以 2:chatGPT插件目前需要登陆账号才能使用,官方介绍下一个版本会有升级(不需要登陆) a:前往 ChatGPT 并登录或注册。 首先要先注册,注册的时候邮箱号可以填国内的也可以用…

利他合作,共赢未来 | 数商云全国渠道代理商招募政策发布

12月2日下午,以“利他合作,共赢未来”为主题的数商云全国渠道代理商招募政策发布会在广州顺利召开,与线上线下来自全国各地区的60家优质厂商共同解读数商云首次公开的招商政策、深入体验数商云全线产品体系,挖掘千亿数字化采购市场…

leecode#有效的电话号码#第十行#上升的温度

题目描述: 给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。…