
Hello World GraphQL dengan Expressjs

Apa yang kamu minta, itulah yang kamu dapat. Itulah yang ditawarkan oleh GraphQL.
Misalkan, kamu mengirimkan
query {
hello
}
maka, yang akan kamu dapatkan dari server adalah kurang-lebih:
data {
hello: "hello world"
}
Oh ya, selain itu graphql juga merupakan language agnostic, dengan makna, bahwa kamu bisa menulis graphql server dengan bahasa apa saja, dan dia tidak terikat dengan bahasa tertentu. Dia juga seperti REST API, yang berarti dia hanya untuk menampilkan data, baik itu dari satu database, beberapa database, atau REST API yang lainnya, atau bahkan dari graphql server yang lainnya.
Tapi, disini kita tidak akan banyak bahas tentang apa itu graphql. Kita akan belajar, membuat minimal graphql server dengan menggunakan expressjs. Dan hanya melimit dengan 1 query saja, yaitu hello. Istilahnya, kalau di tempat lain membuat program hello world.
Google Perkenalkan Firestore, Database NoSQL Baru
Membuat project nodejs baru
Di sini, yang kamu butuhkan adalah nodejs dan npm atau yarn. Dan kemudian install expressjs nya.
- buat folder baru dengan
mkdir hello-world-graphql - init project baru dengan
yarn initataunpm init.
Install express-js
Dikarenakan kita akan menggunakan express-js sebagai servernya, maka pertama tama install ini dulu dengan yarn add express atau npm install --save express.
Berikutnya, tuliskan kode dibawah ini:
var express = require("express"),
app = express();
app.use("/graphql", (req, res, next) => {
res.send("hello world, endpoint ini akan kita jadikan graphql endpoint");
});
app.listen(3000, () => console.log("server berjalan di http://localhost:3000"));
Kode diatas sangat familiar bagi javascript programmer, insyaAlloh. Tapi, bagaimanapun saya akan jelaskan sedikit mengenai hal ini.
- Import package
expressdan buat instance berupaapp - Gunakan property
use, yang kita gunakan untuk meregistermiddlewareke endpoint tertentu. (perhatikan, kita definisikan/graphqlsebagai param pertama) - Kita buat
middlewaresementara yang hanya mengembalikan text sebagai response - Akhirnya, kita jalankan server di port
3000
Vote App (VoteMon) dengan GraphQL dan ReactJS [Bagian 2]
Install graphql-tools, apollo-server-express
apollographql* telah menyediakan tools-set untuk memudahkan kita membuat graphql server. Juga, mereka telah membuatkan graphiql sebagai antarmuka untuk mencoba query/mutation/subscription yang kita definisikan di server. Package ini bernama apollo-server-express.
Di sisi lain, graphql-tools memudahkan kita untuk membuat schema beserta resolvers. schema adalah berisi definisi type dan field. Sedangkan resolvers adalah fungsi untuk menentukan data apa yang akan ditampilkan dengan type/field yang ada. Package ini memiliki dependency berupa graphql package.
Untuk lebih lanjut tentang graphql secara keseluruhan, kamu bisa datang ke https://graphql.org/learn dan mempelajarinya disana.
Jadi, install graphql-tools, graphql, dan apollo-server-express.
* Apollo menyediakan graphql api yang universal, yang dapat kamu gunakan diatas service yang sudah ada, tanpa harus menunggu backend berubah.
Schema
Selanjutnya, mari kita membuat schema. Berikut schema kita, hanya sebuah query, dengan field hello.
type Query {
hello: String
}
Query ini adalah type spesial dalam graphql. Digunakan untuk memberitahukan kepada user, query apa saja yang kita sediakan di dalam graphql server ini. Disana masih ada 2 type lagi yang spesial didalam graphql. Mutation dan Subscription. Diluar kekhususan itu, ketiga type ini sama seperti type type yang lainnya.
Di dalam contoh, kita tuliskan definisi type diatas dengan menjadikannya dia string. Perhatikan berikut:
var typeDefs = `
type Query{
hello : String
}
Kita juga perlu membuat resolvers, untuk memberitahukan kepada graphql server, apa yang akan dikembalikan kepada user, ketika user melakukan query query { hello }. Nah, hello ini mau nampilkan apa?
Dengan graphql-tools ini, untuk mendefinisikan resolvers adalah dengan membuat objek dengan struktur yang sama dengan typeDefs. Berikut contoh resolvers untuk typeDefs diatas:
var resolvers = {
Query: {
hello() {
return "hello world";
}
}
};
Pada akhirnya, kita gabungkan typeDefs ini dengan resolvers dan jadikan mereka sebagai schema menggunakan makeExecutableSchema dari graphql-tools
var schema = makeExecutableSchema({typeDefs: typeDefs, resolvers: resolvers})
Berikut lampiran kode secara keseluruhan
var makeExecutableSchema = require('graphql-tools').makeExecutableSchema;
var typeDefs = `
type Query{
hello: String
}`;
var resolvers = {
Query: {
hello() {
return "hello world";
}
}
};
var schema = makeExecutableSchema({ typeDefs: typeDefs, resolvers: resolvers });
graphqlExpress middleware
Berikutnya, supaya endpoint /graphql bisa kita gunakan, kita perlu menggunakan graphqlExpress middleware ini ke endpoint tersebut. graphqlExpress ini membutuhkan argument berupa objek atau fungsi yang mengembalikan sebuah objek. Tapi disini, kita hanya akan menggunakan objek, karena memang tidak dibuthkan untuk menggunakan fungsi.
graphqlExpress ini adalah middle ware dari apollo-server-express package.
var graphqlExpress = require('apollo-server-express').graphqlExpress;
// ubah implementasi di route `/graphql`
app.use("/graphql", graphqlExpress({schema: schema}))
Mari Kita Coba
Pada akhirnya, mari kita coba hello world graphql server kita. Navigasikan halamann web ke http://localhost:3000/graphql. Apa yang kamu dapati?
get query missing
Hmmt, bagus. Tambahkan query ?query={hello} dan perhatikan apa yang terjadi.
Penutup
Selamat, kamu telah membuat hello world versi graphql. Dan pada akhirnya, bila kamu ingin melihat script server secara utuh, kamu bisa datang ke repo ini
Terimakasih, dan semoga bermanfaat.
What do you think?
Reactions