react graphql起手和特性介紹(二)

2021-09-13 01:34:47 字數 4151 閱讀 2386

緊接第一篇文章,react+graphql起手和特性介紹(一),我們接下來實現resolver,和自定義請求上下文,來完成建立使用者,發帖,檢視所有帖子的功能

首先,我們進行自定義請求上下文,來模擬資料庫和會話,儲存我們的使用者資料,帖子資料,登入狀態。在server目錄下建立context.js檔案。

// server/context.js

const store = new map(); // 模擬資料庫,儲存註冊使用者,建立的帖子資料

const sessionstore = ;

module.exports = (context) => = context; // 我們是將graphql與koa整合在一起,

// 這裡的ctx就是koa提供的請求上下文

// 我們為 graphql 的 context 新增 session 和 store

context.session = ,

set(value)

};context.store = store;

return context;

}

接下來我們實現user的reslover和對應的schema

// server/resolver/user.js

const idskey = 'user_ids';

let idcount = 0;

const genid = () => ;

module.exports = = ctx;

return session.get();

},// 查詢所有使用者

users(root, query, ) );

return res;

},// 使用者登入

login(root, , )

},gender: ,

// mutation 是與query一樣的根節點,與query沒有什麼區別,只有語義上的區分,

// 對資料進行修改和新增的操作都放在 mutation 中

mutation: , ) }}

# server/schema/user.graphql

...extend type query

# input 代表輸入type,需要輸入的型別需要用input進行定義。

# 比如建立使用者的json資料,其結構需要用input定義,才能使用

input userinput

extend type mutation

為使我們返回的自定義型別資料生效,修改下對mock進行如下修改

// server/mock.js

module.exports =

}

好了,我們的使用者相關功能已經實現完成,現在啟動服務,我們建立乙個使用者,登入,並查詢

在mutation上我們先定義$user變數,語法規定需以$開頭,它的型別是userinput!,對應我們的schema定義,然後在createuser查詢中使用此變數$user,它對應的schema解析變數是data,data就是我們在reslover中訪問請求引數的變數名。具體的請求資料,我們通過query variables進行定義,它是json格式的資料,"user"對應我們的$user變數,裡面的結構與userinput!一一對應,並輸入值。建立完使用者之後會將使用者資料返回,並有對應的id值。

登入使用者

查詢所有使用者

根據我們的定義,查詢出來的是陣列型別

讓我們繼續完成帖子的功能

// server/resolver/post.js

const idskey = 'post_ids';

let idcount = 0;

const genid = () => ;

module.exports = ) ,

posts(root, query, ) );

return res;}},

post: ) }},

mutation: , ) }}

為了格式化錯誤,在建立服務時,自定義formaterror

// server/index.js

...const server = new apolloserver(,

});...

繼續完善post schema

# server/schema/post.graphql

...extend type query

input postinput

extend type mutation

如果會話有異常,沒有cookie資訊,修改下graphql gui客戶端的配置

修改 "request.credentials": "omit" 為 "request.credentials": "include"

下面我們進行建立帖子和查詢帖子的操作

可以看到,我們在**createpost和posts**中並沒有查詢user,這裡也會返回user資料,是因為我們定義了post的user欄位對應的reslover方法,在返回型別為post時,posts/createpost返回的資料user欄位為空,graphql就會自動呼叫user的reslover方法,並且之前posts/createpost返回的資料會作為user的reslover中root引數傳入,這樣我們就可以從root資料中獲取userid,然後對user資料的查詢只用放在乙個地方執行就可以。graphql很好地分化了型別資料的處理邏輯,使每個resolver只關注處理此層對應的資料,剩下的資料拼接graphql會幫我們處理好。

最後我們將用自定義指令,來實現服務端鑑權操作

建立檔案directive.js

// server/directive.js

const = require('apollo-server-koa');

class authdirective extends schemadirectivevisitor else };}

}module.exports =

在schema中定義指令

# server/schema/schema.graphql

...# 使用directive關鍵子定義指令, auth 指令名,age為此指令接收的引數

directive @auth(

age: int,

) on field_definition

# field_definition 表示此指令應用於字段定義

使用指令

# server/schema/post.graphql

...extend type query

...

現在我們再進行查詢,發現指令已經生效,使用者age小於20是不能查出posts資料的,而post是可以查出資料的

到此,我們graphql後端服務的搭建和特性就介紹完了,後面我們會介紹前端react如何整合graphql

Python起手式 型別和物件

1.內建函式 id 可以返回乙個物件的唯一標識,返回值為整型,用於比較該物件在記憶體中的位置,在python中,一切都是物件,比如建立乙個值為1的物件,a只是引用這個新創將物件的乙個名稱,將a賦值給b時,b就成了同一物件的另乙個名稱,a和b的唯一標識都是相同的,使用sys模組的getrefcount...

Python 起手式 檔案操作

一.開啟乙個檔案,並且讀出每一行的內容f open in.txt line f.readline while line print line,end line f.readline f.close open 函式返回乙個新的檔案物件,呼叫該物件可以執行各種檔案操作,readline 方法讀取一行的內...

spring boot起手式踩的坑

44 27.566 info 9440 thread 1 s.c a.context annotation 43195e57 startup date thu dec 2913 44 26 cst 2016 root of context hierarchy 2016 12 29 13 44 27....