初識GraphQL,你的第一個Query

請移步到我的Blog,獲得更好的閱讀體驗!本文的鏈接請點這裏

GraphQL是什麼?

GraphQL官方解釋是一個用於API的查詢語言。這樣說起來可能不太好理解。

例如一個用於請求用戶數據的傳統的restFulAPI:

image (3).png

這個API始終會返回id,name,avatar三個屬性。

如果我們不需要avatar這個屬性呢?

我們可以讓後端的小哥哥小姐姐幫忙去掉avatar這條屬性,或者新寫一個接口做這個事情。

那麼,可不可以前端去控制需要的字段?

答案是可以的,GraphQL爲此而生。下面的代碼塊是一個graphQL查詢語句,當我們只需要account的id和name時這樣寫查詢就可以了,如果需要avatar,我們再加上avatar就可以了。

{
  account {
    id
    name
  }
}

這樣對比restFulAPI而言,graphQL更加靈活,能夠準確獲取想要的數據。

結論:查詢語句放在前端,由前端來控制需要的數據,所以是用於API的查詢語言。

爲什麼要使用GraphQL?

  • 字段冗餘
  • 獲取多個數據,只用一個請求
  • 清晰的描述所有的數據類型,數據結構

如何使用GraphQL?

這裏我用nestjs作爲後端服務器,不熟悉nestjs的小夥伴可以點這裏學習一下nestjs。

  1. 創建後端服務
npm i -g @nestjs/cli
nest new graph-ql
cd graph-ql
  1. 安裝graphQL相關依賴
yarn add @nestjs/graphql apollo-server-express graphql-tools graphql
  1. 在ApplicationModule中引用GraphQLModule
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({}),
  ],
})
export class ApplicationModule {}
  1. 設置Schema的路徑,這樣,GraphQL就可以檢測到我們的graphql文件了
GraphQLModule.forRoot({
  typePaths: ['./**/*.graphql'],
}),
  1. 創建我們的account查詢

在src下新建名爲account的文件夾,及相關代碼文件

# account.graphql
type Account {
    id: Int
    name: String
    avatar: String
}
type Query {
    account(id: ID!): Account
}
// account.schema.ts
export abstract class Account {
    id?: number;
    name?: string;
    avatar?: string;
}
// account.resolvers.ts
import { ParseIntPipe } from '@nestjs/common';
import { Args, Query, Resolver } from '@nestjs/graphql';
import { Account } from './account.schema';

const account: Account = {
  id: 0,
  name: 'eick',
  avatar: 'https://avatars0.githubusercontent.com/u/22267244'
}

@Resolver('Account')
export class AccountResolvers {
  @Query('account')
  async account(@Args('id', ParseIntPipe) id: number): Promise<Account> {
    return account;
  }
}
// account.module.ts
import { Module } from '@nestjs/common';
import { AccountResolvers } from './account.resolvers';

@Module({
  imports: [],
  providers: [AccountResolvers],
})
export class AccountModule { }
  1. 在AppModule中引用AccountModule
// app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { AccountModule } from './account/account.module';

@Module({
  imports: [
    AccountModule,
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
    }),
  ],
})
export class AppModule { }
  1. 啓動nestjs服務
yarn run start:dev
  1. 訪問http://localhost:3000/graphql,打開Playground查詢界面

image (1).png

這樣,我們的第一個graphQL就已經寫好啦。

我們可以在Playground的左側面板中輸入查詢語句:

{
  account(id:1){
    name
  }
}

點擊查詢按鈕,就會出現我們需要的數據啦:

image (2).png

到這裏,graphQL的一個簡單的query就完成啦,示例中沒有關聯數據庫,可以自行在resolver中查詢數據庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章