İndiyədək sxemi təsvir edir və sorğular yazırdıq, amma onları icra etməyə yer yox idi: həqiqi server lazımdır. Restoranı təsəvvür edin. Sxem — menyudur: nə sifariş etmək olar. Resolver-lər — aşpazlardır, hər biri öz yeməyini hazırlamağı bacarır. Apollo Server isə baş ofisiantdır: sifarişi (sorğunu) qəbul edir, menyu ilə tutuşdurur, aşpazlara tapşırıq paylayır və hazır yeməkləri müştəriyə gətirir. Bu dərsdə belə «ofisiantı» Node.js-də işə salacaq, ona blog sxemini qoşacaq və Apollo Sandbox-u — sorğular üçün brauzer «sınaq meydançasını» açacaqsınız.

Nələr lazımdır

Apollo Server — Node.js üçün ən populyar GraphQL serveridir; 5-ci versiya və Node.js 20+ lazımdır. @apollo/server paketi serverin özüdür, graphql isə sorğuları təhlil edən və icra edən «mühərrikdir» (GraphQL.js). Apollo Server 5 graphql 16 ilə işləyir, npm isə susmaya görə 17-ni quraşdırıb ERESOLVE xətası ilə dayanardı, ona görə versiyanı açıq yazırıq: graphql@16. TypeScript üçün typescript, tsx (.ts faylları ayrıca yığım olmadan işə salır) və @types/node əlavə edək:

bash
mkdir blog-api && cd blog-api
npm init --yes && npm pkg set type="module"
npm install @apollo/server graphql@16
npm install -D typescript tsx @types/node

npm pkg set type="module" əmri ES modulları aktiv edir: faylda import və yuxarı səviyyədə await yazmaq olar. package.json-a "dev": "tsx watch src/index.ts" (hər yadda saxlamada yenidən başlatma) və "typecheck": "tsc --noEmit" skriptlərini əlavə edin. tsconfig.json-da strict, module: "nodenext", verbatimModuleSyntax, habelə allowImportingTsExtensions ilə noEmit aktiv edin: belə olduqda öz fayllarınızı .ts uzantısı ilə import etmək olur — Prisma mövzularındakı ./generated/prisma/client.ts kimi. tsx tipləri yoxlamır — bunu tsc --noEmit edir.

20 sətirdə ilk server

ts
// src/index.ts
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';

const typeDefs = `#graphql
  type Query {
    hello: String!
  }
`;

const resolvers = {
  Query: {
    hello: () => 'Hello, GraphQL!',
  },
};

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

const { url } = await startStandaloneServer(server, {
  listen: { port: 4000 },
});
console.log(`Server ready at ${url}`);
  • typeDefs — SDL dilində sətir kimi yazılmış sxem. #graphql şərhi serverə təsir etmir, amma redaktora sintaksisi rəngləməyi bildirir.
  • resolvers — obyekt-«xəritə»: tipin adı (Query), sahənin adı (hello) və məlumatı qaytaran funksiya. Bu funksiyanı resolver adlandırırlar.
  • new ApolloServer({ typeDefs, resolvers }) serveri yığır, startStandaloneServer isə onun ətrafında HTTP server başladır — Express lazım deyil — və url qaytarır.

npm run dev əmrini işə salın — konsolda Server ready at http://localhost:4000/ görünəcək. Ünvanı brauzerdə açın: bu Apollo Sandbox-dur. Əməliyyatlar panelinə { hello } yazıb işə salın — cavab olaraq { "data": { "hello": "Hello, GraphQL!" } } gələcək. Sənədlər və avtotamamlama sxeminizdən özü qurulur — bu, birinci dərsdəki introspection-dur.

Sorğunun yolu: HTTP server, Apollo Server, sizin resolver-lər, məlumat və cavabın geri qayıtması
Sorğunun yolu: HTTP server, Apollo Server, sizin resolver-lər, məlumat və cavabın geri qayıtması

💡 Sandbox NODE_ENV production-a bərabər olmayana qədər görünür; production-da onun yerinə sadə səhifə çıxır, introspection isə susmaya görə söndürülür (ətraflı — təhlükəsizlik dərsində).