日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GraphQL 学习

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GraphQL 学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GraphQL 學習

一、什么是GraphQL

一種用于 API 的查詢語言

二、學習GraphQL

開始擼碼學習

1.寫一個 server.js 文件

const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql');const schema = buildSchema(`type Query {hello: String} `);const root = {hello: () => 'Hello world!'};const app = express(); app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql')); 使用命令 1. 使用 npm init -y 初始化一個 package.json 文件 2. 安裝所需插件 npm install express express-graphql graphql -S


遇上錯誤如上:項目名稱不能使用 grapql,修改成 my-graphql

2.啟動項目測試

命令: node server.js

遇上端口占用問題,停掉或者改用其他端口。

相關命令: lsof -i :4000kill -9 端口號(上圖為,47806)

如上所示,啟動成功。 訪問地址: localhost:4000/graphql

訪問成功

3.定義復雜類型

定義一個 學生類型 student const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql');const schema = buildSchema(`type Student{name:Stringage:Int}type Query {hello: Stringname:Stringstudent:Student} `);const root = {hello: () => 'Hello world!',name:()=>{return 'zhangbf'},student:()=>{return {name:'張三豐',age:18}} };const app = express(); app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql')); 運行結果

4. 定義參數類型

新建一個 baseType.js文件 const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql');const schema = buildSchema(`type Query {getClassMates(classNo:Int):[String]} `);const root = {getClassMates({classNo}) {const obj = {301: ['張三豐', '張翠山', '殷素素'],61: ['張大三', '李大四', '王大五'],};return obj[classNo];} };const app = express(); app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql')); 運行該文件 node baseType.js 在瀏覽器查看結果,如下

示例二 const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql');const schema = buildSchema(`type Student{name:Stringsex:Stringage:Intgrade(number:Int):String}type Query {getClassMates(classNo:Int):[String]student(username:String):Student} `);const root = {getClassMates({classNo}) {const obj = {301: ['張三豐', '張翠山', '殷素素'],601: ['張無忌', '趙敏', '周芷若'],};return obj[classNo];},student({username}){const name=username;const sex="男";const age=20;const grade=({number})=>{if(number>60){return "及格了"}else{return "垃圾"}};return {name,sex,age,grade}} };const app = express(); app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

三、使用GraphQL

1.在客戶端訪問graphql的接口

1.1 允許靜態資源訪問目錄

app.use(express.static('public'));

1.2 在 public 目錄下添加 index.html 文件

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>graphql 客戶端訪問接口</title> </head> <body> <button onclick="getData()">獲取數據</button> </body><script>function getData() {const query = `query Student($username:String,$number:Int){student(username:$username){nameagesexgrade(number:$number)}}`;const variables = {username: '張三豐', number: 56};fetch('/graphql', {method: "POST",headers: {'Content-Type': 'application/json','Accept': 'application/json',},body: JSON.stringify({query: query,variables: variables})}).then(res => res.json).then(json => {console.log(json);})} </script> </html>

1.3 重新啟動

node baseType.js

1.4 查看訪問結果

2. 在客戶端修改數據

創建一個文件,用于測試 插入數據、更新數據。

2.1 新建一個 mutation.js 文件

創建一個 mutation.js 文件 const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql');const schema = buildSchema(`input StudentInput{name:Stringage:Intsex:Stringgrade:Int}type Student{name:Stringage:Intsex:Stringgrade:Int}type Mutation{createStudent(input:StudentInput):StudentupdateStudent(id:ID!,input:StudentInput):Student}type Query{student:[Student]} `);const fakeDb = {};//數據庫對象const root = {student() {const arr = [];for (const index in fakeDb) {arr.push(fakeDb[index]);}return arr;},createStudent({input}) {//類似保存到數據庫fakeDb[input.name] = input;//返回保存結果return fakeDb[input.name];},updateStudent({id, input}) {//保存在一個對象里面const updateStudent = Object.assign({}, fakeDb[id], input);fakeDb[id] = updateStudent;//返回對象return updateStudent;} };const app = express(); app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

2.2 執行查看結果

node mutation.js

2.3 認證中間件

創建一個 middleware.js 文件,用于測試 const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql');const schema = buildSchema(`input StudentInput{name:Stringage:Intsex:Stringgrade:Int}type Student{name:Stringage:Intsex:Stringgrade:Int}type Mutation{createStudent(input:StudentInput):StudentupdateStudent(id:ID!,input:StudentInput):Student}type Query{student:[Student]} `);const fakeDb = {};//數據庫對象const root = {student() {const arr = [];for (const index in fakeDb) {arr.push(fakeDb[index]);}return arr;},createStudent({input}) {//類似保存到數據庫fakeDb[input.name] = input;//返回保存結果return fakeDb[input.name];},updateStudent({id, input}) {//保存在一個對象里面const updateStudent = Object.assign({}, fakeDb[id], input);fakeDb[id] = updateStudent;//返回對象return updateStudent;} };const app = express();const middleware = (req, res, next) => {if (req.url.indexOf('/graphql') !== -1 && req.headers.cookie.indexOf('auth') === -1) {res.send(JSON.stringify({error: '您沒有權限訪問該接口'}));return false;}//放行next(); };//注冊中間件 app.use(middleware);app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, }));app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

添加 auth值

3. 使用ConstructingTypes 類型

為了便于維護,使用 ConstructingTypes 類型

1.創建 constructingTypes.js 測試文件

const express = require('express'); const graphqlHTTP = require('express-graphql'); const graphql = require('graphql');var StudentType = new graphql.GraphQLObjectType({name: "Student",fields: {name: {type: graphql.GraphQLString},age: {type: graphql.GraphQLInt},sex: {type: graphql.GraphQLString},grade: {type: graphql.GraphQLInt},} });var queryType = new graphql.GraphQLObjectType({name: 'Query',fields: {student: {type: StudentType,args: {username: {type: graphql.GraphQLString}},resolve: function (_, {username}) {const name = username;const sex = '男';const age = 18;const grade = 20;return {name,sex,age,grade}}}} });var schema = new graphql.GraphQLSchema({query: queryType});const app = express();app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, }));app.listen(4000, () => console.log('Now browse to localhost:4000/graphql')); 查看運行結果

四.與數據庫相結合

1.創建測試數據庫 test

在 test數據庫下面 創建 student 表

2.在安裝mysql插件

在 npmjs.com 網站找 mysql 安裝npm install mysql2 -S

3. 創建 database.js 測試文件

const express = require('express'); const graphqlHTTP = require('express-graphql'); const {buildSchema} = require('graphql'); const mysql = require('mysql2');//https://www.npmjs.com/package/mysql2 mysql//連接數據庫 const connection = mysql.createConnection({host: 'localhost', //數據庫訪問地址user: 'root', //數據庫用戶password: 'root', //數據庫訪問密碼database: 'test' //數據庫 });const schema = buildSchema(`input StudentInput{name:Stringage:Intsex:Stringgrade:Int}type Student{name:Stringage:Intsex:Stringgrade:Int}type Mutation{createStudent(input:StudentInput):StudentdeletedStudent(id:ID!):BooleanupdateStudent(id:ID!,input:StudentInput):Student}type Query{student:[Student]} `);const root = {student() {//查詢操作return new Promise((resolve, reject) => {connection.query('select name,sex,age,grade from student', (err, results) => {if (err) {console.log(results);console.log('出錯了:' + err);return false;}const arr = [];for (let i = 0; i < results.length; i++) {arr.push({name: results[i].name,sex: results[i].sex,age: results[i].age,grade: results[i].grade,})}resolve(arr);})});},createStudent({input}) {//保存到數據庫const data = {name: input.name,age: input.age,sex: input.sex,grade: input.grade,};return new Promise((resolve, reject) => {connection.query('insert into student set ?', data, (err,results) => {if (err) {console.log(results);console.log('出錯了:' + err.message);return false;}resolve(data);});});},updateStudent({id, input}) {//更新操作const data = input;return new Promise((resolve, reject) => {connection.query('update student set ? where name=?', [data, id], (err,results) => {if (err) {console.log(results);console.log('出錯了:' + err.message);return false;}resolve(data);});});},deletedStudent({id}) {//刪除操作return new Promise((resolve,reject)=>{connection.query('delete from student where name=?',[id],(err,results)=>{if (err) {console.log(results);console.log('出錯了:' + err.message);reject(false);return false;}resolve(true);})});} };const app = express();app.use('/graphql', graphqlHTTP({schema: schema,rootValue: root,graphiql: true, }));app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

4.查看演示結果

啟動 node database.js

總結

以上是生活随笔為你收集整理的GraphQL 学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美色图久久 | 欧美天天射 | 涩涩爱在线 | 久草视频播放 | 动漫美女被到爽流 | 欧美顶级少妇做爰 | 悟空影视大全免费高清观看在线 | 天堂视频一区 | 最新天堂中文在线 | 亚洲91色 | 色综合综合| 六月激情网 | 欧美日韩系列 | 精品久久久精品 | 亚洲首页 | av手机在线 | 永久免费AV无码网站韩国毛片 | 中文字幕精品视频 | 日日夜夜免费精品视频 | 欧美激情电影一区二区 | 午夜剧场福利社 | 亚洲三级久久 | 在线免费观看av网址 | 九九久久视频 | 国产av人人夜夜澡人人爽麻豆 | 韩国一二三区 | 青娱乐97| 亚洲一区 视频 | 韩国一区二区在线观看 | 久久伊人操 | 嫩草研究院在线观看 | 久久亚洲视频 | 一级久久 | 国产a久久麻豆入口 | 国产67194| 中文字幕一区二区人妻在线不卡 | 日韩亚洲国产欧美 | 亚洲男人天堂久久 | 亚洲欧美一区二区视频 | 天天拍天天射 | 免费黄色三级网站 | 欧美成人一区二区三区 | 先锋资源av网 | 国产黑丝91 | 特级淫片裸体免费看 | 特级丰满少妇一级aaa爱毛片 | 日韩在线视频免费播放 | 欧美三级视频在线播放 | 久久国产一级片 | 日韩精品人妻一区二区中文字幕 | 国产高清视频在线播放 | 性生交大片免费看女人按摩 | 久久久久久久久久网站 | 精品中文视频 | 搞逼综合网 | 国产日韩精品一区 | 日韩精品人妻一区二区中文字幕 | 国产午夜福利100集发布 | 爱情岛亚洲首页论坛 | 精品国产午夜福利在线观看 | 国产三级在线看 | 国产在线网站 | 老色批影院 | 69精品久久 | 成人在线观看视频网站 | 美女看片 | 亚洲一区免费在线观看 | 日韩大片在线 | 亚洲天堂av线 | 欧美亚韩一区二区三区 | 国产91精品露脸国语对白 | 日韩人妻精品中文字幕 | 亚洲清纯唯美 | 欧美一级性| 69日本xxxxxxxx96 | 欧美成人免费视频 | 久色精品视频 | 激情网久久 | 精品黑人一区二区三区国语馆 | 精品一区二区三区免费看 | www色视频 | 精品国产一区二区三区在线 | 日韩av高清 | av网站大全在线观看 | av一区二区免费 | 五月婷婷六月丁香综合 | 亚洲女人网 | 神马国产 | 91在线观看免费高清 | 亚洲永久免费视频 | √天堂8资源中文在线 | 自拍偷拍视频在线 | 男女黄色网 | 波波野结衣 | 美女露隐私网站 | 福利二区视频 | 成人a区| 中文字幕 日韩 欧美 | 色xxxxx|