跳至主要內容

如何將 Apollo 與 Deno 搭配使用

Apollo Server 是一個 GraphQL 伺服器,你可以在幾分鐘內設定好並與現有的資料來源(或 REST API)一起使用。然後,你可以將任何 GraphQL 應用程式連接到它以接收資料,並利用 GraphQL 的好處,例如類型檢查和高效擷取。

我們將建立一個簡單的 Apollo 伺服器並執行,它將允許我們查詢一些本機資料。我們只需要三個檔案

  1. schema.ts 來設定我們的資料模型
  2. resolvers.ts 來設定我們將如何填入架構中資料欄位的資料
  3. 我們的 main.ts,伺服器將在此啟動

我們將從建立它們開始

touch schema.ts resolvers.ts main.ts

讓我們逐步設定每個檔案。

在此查看原始碼。

schema.ts

我們的 schema.ts 檔案描述我們的資料。在這個案例中,我們的資料是一個恐龍清單。我們希望我們的使用者能夠取得每個恐龍的名稱和簡短說明。在 GraphQL 語言中,這表示 Dinosaur 是我們的**類型**,而 namedescription 是我們的**欄位**。我們也可以定義每個欄位的資料類型。在這個案例中,兩者都是字串。

這也是我們使用 GraphQL 中的特殊**查詢**類型來描述我們允許的資料查詢的地方。我們有兩個查詢

  • dinosaurs 取得所有恐龍的清單
  • dinosaur 將恐龍的 name 作為引數,並傳回關於該種類恐龍的資訊。

我們將在我們的 typeDefs 類型定義變數中匯出所有這些

export const typeDefs = `
type Dinosaur {
name: String
description: String
}

type Query {
dinosaurs: [Dinosaur]
dinosaur(name: String): Dinosaur
}
`;

如果我們想要寫入資料,這也是我們將描述**突變**的地方。突變是你使用 GraphQL 寫入資料的方式。由於我們在此使用靜態資料集,我們不會寫入任何內容。

resolvers.ts

解析器負責填入每個查詢的資料。在此,我們有恐龍清單,而解析器將執行以下任一動作:a) 如果使用者要求dinosaurs查詢,則將整個清單傳遞給用戶端,或 b) 如果使用者要求dinosaur查詢,則只傳遞一個。

const dinosaurs = [
{
name: "Aardonyx",
description: "An early stage in the evolution of sauropods.",
},
{
name: "Abelisaurus",
description: '"Abel\'s lizard" has been reconstructed from a single skull.',
},
];

export const resolvers = {
Query: {
dinosaurs: () => dinosaurs,
dinosaur: (_: any, args: any) => {
return dinosaurs.find((dinosaur) => dinosaur.name === args.name);
},
},
};

後者會將用戶端的參數傳遞到函式中,以將名稱與資料集中的名稱配對。

main.ts

在我們的main.ts中,我們將從 schema 和解析器匯入ApolloServergraphql以及我們的typeDefs

import { ApolloServer } from "npm:@apollo/server@^4.1";
import { startStandaloneServer } from "npm:@apollo/server@4.1/standalone";
import { graphql } from "npm:graphql@16.6";
import { typeDefs } from "./schema.ts";
import { resolvers } from "./resolvers.ts";

const server = new ApolloServer({
typeDefs,
resolvers,
});

const { url } = await startStandaloneServer(server, {
listen: { port: 8000 },
});

console.log(`Server running on: ${url}`);

我們將我們的typeDefsresolvers傳遞給ApolloServer以啟動新伺服器。最後,startStandaloneServer是一個輔助函式,可快速啟動並執行伺服器。

執行伺服器

現在,剩下的就是執行伺服器

deno run --allow-net --allow-read --allow-env main.ts

您應該在終端機中看到Server running on: 127.0.0.1:8000。如果您前往該地址,您將看到 Apollo 沙盒,我們可以在其中輸入我們的dinosaurs查詢

query {
dinosaurs {
name
description
}
}

這將傳回我們的資料集

{
"data": {
"dinosaurs": [
{
"name": "Aardonyx",
"description": "An early stage in the evolution of sauropods."
},
{
"name": "Abelisaurus",
"description": "\"Abel's lizard\" has been reconstructed from a single skull."
}
]
}
}

或者,如果我們只想要一個dinosaur

query {
dinosaur(name:"Aardonyx") {
name
description
}
}

會傳回

{
"data": {
"dinosaur": {
"name": "Aardonyx",
"description": "An early stage in the evolution of sauropods."
}
}
}

太棒了!

在他們的教學課程中進一步了解如何使用 Apollo 和 GraphQL.