快速開(kāi)始
Nest是Nodejs的一個(gè)重要實(shí)現(xiàn),它實(shí)現(xiàn)了一套類(lèi)似SpringBoot的MVC框架結(jié)構(gòu),支持注釋和自動(dòng)注入等編程方法,使用Typescript的強(qiáng)類(lèi)型來(lái)提供可靠的開(kāi)發(fā)體驗(yàn)。
GraphQL的出現(xiàn)使得對(duì)于服務(wù)API的設(shè)計(jì)進(jìn)入到了和數(shù)據(jù)庫(kù)設(shè)計(jì)一樣的水平,通過(guò)精心設(shè)計(jì)的schema,可以長(zhǎng)期保證服務(wù)的穩(wěn)定和可用性,同時(shí)又不會(huì)限制后臺(tái)服務(wù)邏輯的升級(jí)。
此次采用Nest作為服務(wù)環(huán)境來(lái)搭建一個(gè)GraphQL服務(wù)腳手架,能夠滿(mǎn)足基本業(yè)務(wù)需求場(chǎng)景,方便在此基礎(chǔ)上進(jìn)行二次開(kāi)發(fā)。
預(yù)設(shè)的業(yè)務(wù)需求場(chǎng)景包括以下內(nèi)容:
- 簡(jiǎn)單查詢(xún)、關(guān)聯(lián)查詢(xún),增刪改操作
- 循環(huán)依賴(lài)關(guān)系的Module定義
- 訪問(wèn)控制管理,增加角色定義,可對(duì)指定操作按角色進(jìn)行控制
- 查詢(xún)分頁(yè)功能
- ...
依賴(lài)
Nest本身只是提供了對(duì)Apollo GraphQL Server的封裝,因此底層還是需要安裝apollo-server。
"dependencies": {
"@nestjs/common": "^7.0.1",
"@nestjs/core": "^7.0.1",
"@nestjs/graphql": "^7.3.9",
"@nestjs/platform-express": "^7.0.1",
"apollo-server": "^2.13.1",
"apollo-server-express": "^2.13.1",
"class-transformer": "^0.2.3",
"class-validator": "^0.12.2",
"graphql": "^15.0.0",
"graphql-tools": "^5.0.0",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^6.5.4"
},
"devDependencies": {
"@nestjs/cli": "^7.0.0",
"@nestjs/schematics": "^7.0.0",
"@nestjs/testing": "^7.0.1",
"@types/express": "^4.17.3",
"@types/jest": "^25.1.4",
"@types/node": "^13.9.1",
"@types/supertest": "^2.0.8",
"@typescript-eslint/eslint-plugin": "^2.23.0",
"@typescript-eslint/parser": "^2.23.0",
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.10.0",
"eslint-plugin-import": "^2.20.1",
"jest": "^25.1.0",
"prettier": "^1.19.1",
"supertest": "^4.0.2",
"ts-jest": "^25.2.1",
"ts-loader": "^6.2.1",
"ts-node": "^8.6.2",
"tsconfig-paths": "^3.9.0",
"typescript": "^3.8.3"
},
示例
采用Nest官方示例進(jìn)行擴(kuò)展,該示例中有兩個(gè)對(duì)象:author和post,類(lèi)型定義如下:
type Author {
id: Int!
firstName: String
lastName: String
posts: [Post!]!
}
type Post {
id: Int!
title: String!
author: Author!
votes: Int
}
下載
可以在碼云上獲取本示例全部源碼
git clone https://gitee.com/apollozhu/demo.graphql.starter.git
截圖

image.png
更詳細(xì)的系列文章可以參考 這里