{"id":47677,"date":"2023-01-02T12:50:43","date_gmt":"2023-01-02T11:50:43","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=47677&#038;preview=true&#038;preview_id=47677"},"modified":"2023-08-24T11:12:37","modified_gmt":"2023-08-24T10:12:37","slug":"graphql-nodejs","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/","title":{"rendered":"Opbygning af GraphQL-API&#8217;er med Node"},"content":{"rendered":"<p>GraphQL er det nye buzzword inden for API-udvikling. Mens RESTful API&#8217;er fortsat er den mest popul\u00e6re m\u00e5de at udstille data fra applikationer p\u00e5, har de mange begr\u00e6nsninger, som GraphQL har til form\u00e5l at l\u00f8se.<\/p>\n<p>GraphQL er et foresp\u00f8rgselssprog, der er skabt af Facebook, og som blev omdannet til et open source-projekt i 2015. Det tilbyder en intuitiv og fleksibel syntaks til at beskrive og tilg\u00e5 data i et API.<\/p>\n<p>Denne vejledning vil unders\u00f8ge, hvordan man opbygger et GraphQL <a href=\"https:\/\/kinsta.com\/dk\/blog\/saadan-installeres-node-js\/\">Node.js-projekt<\/a>. Vi vil bruge GraphQL til at bygge en Todo-applikation i <a href=\"https:\/\/kinsta.com\/blog\/what-is-express-js\/\">Express.js webrammen<\/a> til Node.<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Hvad er GraphQL?<\/h2>\n<p>Fra den <a href=\"https:\/\/graphql.org\/\">officielle dokumentation<\/a>: &#8220;GraphQL er et foresp\u00f8rgselssprog til API&#8217;er og en runtime til at opfylde disse foresp\u00f8rgsler med dine eksisterende data. GraphQL giver en komplet og forst\u00e5elig beskrivelse af dataene i din API, giver klienterne mulighed for at sp\u00f8rge om pr\u00e6cis det, de har brug for, og ikke mere, g\u00f8r det lettere at udvikle API&#8217;er over tid og muligg\u00f8r kraftfulde udviklerv\u00e6rkt\u00f8jer.&#8221;<\/p>\n<p>GraphQL er en server-side runtime til udf\u00f8relse af foresp\u00f8rgsler ved hj\u00e6lp af det typesystem, du har defineret for dine data. GraphQL er heller ikke bundet til nogen specifik database eller lagringsmotor. I stedet bakkes den op af din eksisterende kode og datalagring. Du kan f\u00e5 en detaljeret sammenligning af disse teknologier med <a href=\"https:\/\/kinsta.com\/dk\/blog\/graphql-vs-rest\/\">GraphQL vs. RESTful API-guiden<\/a>.<\/p>\n<p>Hvis du vil oprette en GraphQL-tjeneste, starter du med at definere skematyper og oprette felter ved hj\u00e6lp af disse typer. Dern\u00e6st leverer du en funktionsopl\u00f8ser, der skal udf\u00f8res p\u00e5 hvert felt og hver type, n\u00e5r der anmodes om data fra klientsiden.<\/p>\n<h2>GraphQL-terminologi<\/h2>\n<p>GraphQL-typesystemet bruges til at beskrive, hvilke data der kan foresp\u00f8rges, og hvilke data du kan manipulere. Det er kernen i GraphQL. Lad os diskutere forskellige m\u00e5der, hvorp\u00e5 vi kan beskrive og manipulere data i GraphQ.<\/p>\n<h3>Objekttyper<\/h3>\n<p>GraphQL-objekttyper er datamodeller, der indeholder st\u00e6rkt skrevne felter. Der skal v\u00e6re en 1-til-1-mapping mellem dine modeller og GraphQL-typer. Nedenfor er et eksempel p\u00e5 en GraphQL-type:<\/p>\n<pre><code class=\"language-json\">type User {\n  id: ID! # The \"!\" means required\n  firstname: String\n  lastname: String\n  email: String\n  username: String\n  todos: [Todo] # Todo is another GraphQL type\n}<\/code><\/pre>\n<h3>Queries<\/h3>\n<p>GraphQL Query definerer alle de foresp\u00f8rgsler, som en klient kan k\u00f8re p\u00e5 GraphQL API&#8217;et. Du b\u00f8r definere en <code>RootQuery<\/code>, som vil indeholde alle eksisterende foresp\u00f8rgsler som en konvention.<\/p>\n<p>Nedenfor definerer og mapper vi foresp\u00f8rgslerne til den tilsvarende RESTful API:<\/p>\n<pre><code class=\"language-json\">type RootQuery {\n  user(id: ID): User           # Corresponds to GET \/api\/users\/:id\n  users: [User]                # Corresponds to GET \/api\/users\n  todo(id: ID!): Todo    # Corresponds to GET \/api\/todos\/:id\n  todos: [Todo]          # Corresponds to GET \/api\/todos\n}<\/code><\/pre>\n<h3>Mutations<\/h3>\n<p>Hvis GraphQL-foresp\u00f8rgsler er <code>GET<\/code> -foresp\u00f8rgsler, er mutationer <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> og <code>DELETE<\/code> -foresp\u00f8rgsler, der manipulerer GraphQL API.<\/p>\n<p>Vi vil placere alle mutationer i en enkelt <code>RootMutation<\/code> for at demonstrere dem:<\/p>\n<pre><code class=\"language-json\">type RootMutation {\n  createUser(input: UserInput!): User             # Corresponds to POST \/api\/users\n  updateUser(id: ID!, input: UserInput!): User    # Corresponds to PATCH \/api\/users\n  removeUser(id: ID!): User                       # Corresponds to DELETE \/api\/users\n  createTodo(input: TodoInput!): Todo\n  updateTodo(id: ID!, input: TodoInput!): Todo\n  removeTodo(id: ID!): Todo\n}<\/code><\/pre>\n<p>Du har bem\u00e6rket brugen af <code>-input<\/code> typer til mutationerne s\u00e5som <code>UserInput<\/code>, <code>TodoInput<\/code>. Det er altid den bedste praksis altid at definere inputtyper til oprettelse og opdatering af dine ressourcer.<\/p>\n<p>Du kan definere inputtyperne som nedenfor:<\/p>\n<pre><code class=\"language-json\">input UserInput {\n  firstname: String!\n  lastname: String\n  email: String!\n  username: String!\n}<\/code><\/pre>\n<h3>Resolvers<\/h3>\n<p>Resolvers fort\u00e6ller GraphQL, hvad der skal ske, n\u00e5r der anmodes om hver foresp\u00f8rgsel eller mutation. Det er en grundl\u00e6ggende funktion, der g\u00f8r det h\u00e5rde arbejde med at ramme databaselaget for at udf\u00f8re CRUD-operationer (oprette, l\u00e6se, opdatere, slette), ramme et internt RESTful API endpoint eller kalde en <a href=\"https:\/\/kinsta.com\/blog\/microservices-vs-api\/\">microservice<\/a> for at opfylde klientens anmodning.<\/p>\n<p>Du kan oprette en ny <strong>resolvers.js<\/strong>-fil og tilf\u00f8je f\u00f8lgende kode:<\/p>\n<pre><code class=\"language-js\">import sequelize from '..\/models';\nexport default function resolvers () {\n  const models = sequelize.models;\n  return {\n    \/\/ Resolvers for Queries\n    RootQuery: {\n      user (root, { id }, context) {\n        return models.User.findById(id, context);\n      },\n      users (root, args, context) {\n        return models.User.findAll({}, context);\n      }\n    },\n    User: {\n      todos (user) {\n        return user.getTodos();\n      }\n    },\n  }\n  \/\/ Resolvers for Mutations\n  RootMutation: {\n    createUser (root, { input }, context) {\n      return models.User.create(input, context);    \n    },\n    updateUser (root, { id, input }, context) {\n      return models.User.update(input, { ...context, where: { id } });\n    },\n    removeUser (root, { id }, context) {\n      return models.User.destroy(input, { ...context, where: { id } });\n    },\n    \/\/ ... Resolvers for Todos go here\n  }\n}<\/code><\/pre>\n<h3>Schema<\/h3>\n<p>GraphQL-skemaet er det, som GraphQL eksponerer for verden. Derfor vil typer, foresp\u00f8rgsler og mutationer blive inkluderet i skemaet for at blive eksponeret for verden.<\/p>\n<p>Nedenfor kan du se, hvordan du eksponerer typer, foresp\u00f8rgsler og mutationer for verden:<\/p>\n<pre><code class=\"language-json\">schema {\n  query: RootQuery\n  mutation: RootMutation\n}<\/code><\/pre>\n<p>I ovenst\u00e5ende script har vi inkluderet <code>RootQuery<\/code> og <code>RootMutation<\/code>, som vi har oprettet tidligere, og som skal eksponeres for verden.<\/p>\n<h2>Hvordan fungerer GraphQL med Node.js og Express.js?<\/h2>\n<p>GraphQL tilbyder en implementering til alle st\u00f8rre programmeringssprog, og Node.js er ikke undtaget. P\u00e5 det <a href=\"https:\/\/graphql.org\/\">officielle GraphQL-websted<\/a> er der en sektion for <a href=\"https:\/\/graphql.org\/code\/#javascript\">JavaScript-underst\u00f8ttelse<\/a>, og der er ogs\u00e5 andre implementeringer af GraphQL for at g\u00f8re det nemt at skrive og kode.<\/p>\n<p>GraphQL Apollo tilbyder en implementering til Node.js og Express.js og g\u00f8r det nemt at komme i gang med GraphQL.<\/p>\n<p>Du vil l\u00e6re at oprette og udvikle din f\u00f8rste GraphQL-applikation i Node.js og <a href=\"https:\/\/kinsta.com\/blog\/what-is-express-js\/\">Express.js<\/a> backend-ramme ved hj\u00e6lp af GraphQL Apollo i n\u00e6ste afsnit.<\/p>\n<h2>Ops\u00e6tning af GraphQL med Express.js<\/h2>\n<p>Det er ligetil at opbygge en GraphQL API-server med Express.js for at komme i gang. I dette afsnit vil vi unders\u00f8ge, hvordan man opbygger en GraphQL-server.<\/p>\n<h3>Initialis\u00e9r projekt med Express<\/h3>\n<p>F\u00f8rst skal du installere og ops\u00e6tte et nyt Express.js-projekt. Opret en mappe til dit projekt, og installer Express.js ved hj\u00e6lp af denne kommando:<\/p>\n<pre><code class=\"language-bash\">cd &lt;project-name&gt; && npm init -y\nnpm install express<\/code><\/pre>\n<p>Ovenst\u00e5ende kommando opretter en ny <strong>package.json<\/strong>-fil og installerer Express.js-biblioteket i dit projekt.<\/p>\n<p>Dern\u00e6st strukturerer vi vores projekt som vist i billedet nedenfor. Det vil indeholde forskellige moduler til projektets funktioner som f.eks. brugere, todos osv.<\/p>\n<figure style=\"width: 467px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/12\/graphql-todo-structrue.png\" alt=\"En liste over filer i graphql-todo.\" width=\"467\" height=\"595\"><figcaption class=\"wp-caption-text\">Filer til <em>graphql-todo<\/em>.<\/figcaption><\/figure>\n<h3>Initialisere GraphQL<\/h3>\n<p>Lad os starte med at installere GraphQL Express.js-afh\u00e6ngighederne. K\u00f8r f\u00f8lgende kommando for at installere:<\/p>\n<pre><code class=\"language-bash\">npm install apollo-server-express graphql @graphql-tools\/schema --save<\/code><\/pre>\n<h3>Oprettelse af skemaer og typer<\/h3>\n<p>Dern\u00e6st opretter vi en <strong>index.js<\/strong>-fil i mappen modules og tilf\u00f8jer f\u00f8lgende kodestump:<\/p>\n<pre><code class=\"language-js\">const { gql } = require('apollo-server-express');\nconst users = require('.\/users');\nconst todos = require('.\/todos');\nconst { GraphQLScalarType } = require('graphql');\nconst { makeExecutableSchema } = require('@graphql-tools\/schema');\nconst typeDefs = gql`\n  scalar Time\n  type Query {\n    getVersion: String!\n  }\n  type Mutation {\n    version: String!\n  }\n`;\nconst timeScalar = new GraphQLScalarType({\n  name: 'Time',\n  description: 'Time custom scalar type',\n serialize: (value) =&gt; value,\n});\nconst resolvers = {\n  Time: timeScalar,\n  Query: {\n    getVersion: () =&gt; `v1`,\n  },\n};\nconst schema = makeExecutableSchema({\n  typeDefs: [typeDefs, users.typeDefs, todos.typeDefs],\n  resolvers: [resolvers, users.resolvers, todos.resolvers],\n});\nmodule.exports = schema;<\/code><\/pre>\n<h4>Kode gennemgang<\/h4>\n<p>Lad os gennemg\u00e5 kodeudsnittet og bryde det ned:<\/p>\n<h5>Trin 1<\/h5>\n<p>F\u00f8rst importerede vi de n\u00f8dvendige biblioteker og oprettede standard foresp\u00f8rgsels- og mutationstyper. Foresp\u00f8rgsels- og mutationstyperne indstiller kun versionen af GraphQL API&#8217;et for nu. Vi vil dog udvide foresp\u00f8rgslen og mutationen til at omfatte andre skemaer, efterh\u00e5nden som vi forts\u00e6tter.<\/p>\n<figure style=\"width: 1266px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/12\/pasted-image-0-1.png\" alt=\"En kommandolinjegr\u00e6nseflade, der viser \"const\"-koden til import af GraphQL og andre udvidelser.\" width=\"1266\" height=\"904\"><figcaption class=\"wp-caption-text\">Import af GraphQL og udvidelser.<\/figcaption><\/figure>\n<h5>Trin 2:<\/h5>\n<p>Derefter oprettede vi en ny scalartype for tid og vores f\u00f8rste resolver til den foresp\u00f8rgsel og mutation, der er oprettet ovenfor. Derudover genererede vi ogs\u00e5 et skema ved hj\u00e6lp af funktionen <code>makeExecutableSchema<\/code>.<\/p>\n<p>Det genererede skema indeholder alle de andre skemaer, vi importerede, og vil ogs\u00e5 indeholde flere, n\u00e5r vi opretter og importerer dem.<\/p>\n<figure style=\"width: 1166px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/12\/pasted-image-0-2.png\" alt=\"En kommandolinjegr\u00e6nseflade, der viser \"const\"-koden til at skabe vores skalartype og vores f\u00f8rste resolver.\" width=\"1166\" height=\"1012\"><figcaption class=\"wp-caption-text\">Oprettelse af en skalar type for tid samt vores f\u00f8rste resolver.<\/figcaption><\/figure>\n<p>Ovenst\u00e5ende kodestump viser, at vi importerede forskellige skemaer i makeExecutableSchema-funktionen. Denne fremgangsm\u00e5de hj\u00e6lper os med at strukturere applikationen med henblik p\u00e5 kompleksitet. Dern\u00e6st skal vi oprette de Todo- og User-skemaer, som vi importerede.<\/p>\n<h3>Oprettelse af Todo-skema<\/h3>\n<p>Todo-skemaet viser simple CRUD-operationer, som brugerne af applikationen kan udf\u00f8re. Nedenfor er det skema, der implementerer Todo CRUD-operationen.<\/p>\n<pre><code class=\"language-js\">const { gql } = require('apollo-server-express');\nconst createTodo = require('.\/mutations\/create-todo');\nconst updateTodo = require('.\/mutations\/update-todo');\nconst removeTodo = require('.\/mutations\/delete-todo');\nconst todo = require('.\/queries\/todo');\nconst todos = require('.\/queries\/todos');\nconst typeDefs = gql`\n  type Todo {\n    id: ID!\n    title: String\n    description: String\n    user: User\n  }\n  input CreateTodoInput {\n    title: String!\n    description: String\n    isCompleted: Boolean\n  }\n  input UpdateTodoInput {\n    title: String\n    description: String\n    isCompleted: Boolean\n  }  extend type Query {\n    todo(id: ID): Todo!\n    todos: [Todo!]\n  }\n  extend type Mutation {\n    createTodo(input: CreateTodoInput!): Todo\n    updateTodo(id: ID!, input: UpdateTodoInput!): Todo\n    removeTodo(id: ID!): Todo\n  }\n`;\n\/\/ Provide resolver functions for your schema fields\nconst resolvers = {\n  \/\/ Resolvers for Queries\n  Query: {\n    todo,\n    todos,\n  },\n  \/\/ Resolvers for Mutations\n  Mutation: {\n    createTodo,\n    updateTodo,\n    removeTodo,\n  },\n};\nmodule.exports = { typeDefs, resolvers };<\/code><\/pre>\n<h4>Gennemgang af kode<\/h4>\n<p>Lad os gennemg\u00e5 kodeudsnittet og bryde det ned:<\/p>\n<h5>Trin 1:<\/h5>\n<p>F\u00f8rst oprettede vi et skema for vores Todo ved hj\u00e6lp af GraphQL <code>type<\/code>, <code>input<\/code> og <code>extend<\/code>. N\u00f8gleordet <code>extend<\/code> bruges til at arve og tilf\u00f8je nye foresp\u00f8rgsler og mutationer til den eksisterende rodforesp\u00f8rgsel og mutation, som vi oprettede ovenfor.<\/p>\n<figure style=\"width: 1092px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/12\/pasted-image-0-3.png\" alt=\"En kommandolinjegr\u00e6nseflade, der viser skemaet for vores Todo-script, inklusive nye input.\" width=\"1092\" height=\"1408\"><figcaption class=\"wp-caption-text\">Oprettelse af skemaet for vores Todo.<\/figcaption><\/figure>\n<h5>Trin 2:<\/h5>\n<p>Dern\u00e6st oprettede vi en resolver, som bruges til at hente de korrekte data, n\u00e5r en bestemt foresp\u00f8rgsel eller mutation kaldes.<\/p>\n<figure style=\"width: 1092px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/12\/pasted-image-0.png\" alt=\"En kommandolinjegr\u00e6nseflade, der viser koden til at oprette en resolver til vores Todo.\" width=\"1092\" height=\"904\"><figcaption class=\"wp-caption-text\">Oprettelse af en resolver.<\/figcaption><\/figure>\n<p>N\u00e5r resolver-funktionen er p\u00e5 plads, kan vi oprette individuelle metoder til forretningslogikken og databasemanipulationen som vist i eksemplet <strong>create-todo.js<\/strong>.<\/p>\n<p>Opret en fil <strong>create-user.js<\/strong> i mappen <code>.\/mutations\/<\/code>, og tilf\u00f8j forretningslogikken for at oprette en ny Todo i din database.<\/p>\n<pre><code class=\"language-js\">const models = require('..\/..\/..\/models');\nmodule.exports = async (root, { input }, context) =&gt; {\n  return models.todos.push({ ...input });\n};<\/code><\/pre>\n<p>Kodestumpen ovenfor er en forenklet m\u00e5de at oprette en ny Todo i vores database ved hj\u00e6lp af Sequelize ORM. Du kan f\u00e5 mere at vide om <a href=\"https:\/\/sequelize.org\/\">Sequelize, og hvordan du konfigurerer det med Node.js<\/a>.<\/p>\n<p>Du kan f\u00f8lge det samme trin for at oprette mange skemaer afh\u00e6ngigt af din applikation, eller du kan <a href=\"https:\/\/github.com\/Kaperskyguru\/graphql-todo-example\">klone det komplette projekt fra GitHub<\/a>.<\/p>\n<p>Dern\u00e6st skal vi ops\u00e6tte serveren med Express.js og k\u00f8re den nyoprettede Todo-applikation med GraphQL og Node.js.<\/p>\n<h3>Ops\u00e6tning og k\u00f8rsel af serveren<\/h3>\n<p>Til sidst vil vi ops\u00e6tte vores server ved hj\u00e6lp af <code>apollo-server-express<\/code> -biblioteket, som vi installerede tidligere, og konfigurere den.<\/p>\n<p><code>apollo-server-express<\/code> er en simpel wrapper af Apollo Server for Express.js, Det anbefales, fordi det er udviklet til at passe ind i Express.js udvikling.<\/p>\n<p>Ved hj\u00e6lp af de eksempler vi diskuterede ovenfor, lad os konfigurere Express.js-serveren til at arbejde med det nyligt installerede <code>apollo-server-express<\/code>.<\/p>\n<p>Opret en <strong>server.js<\/strong>-fil i rodmappen, og inds\u00e6t f\u00f8lgende kode:<\/p>\n<pre><code class=\"language-js\">\nconst express = require('express');\nconst { ApolloServer } = require('apollo-server-express');\nconst schema = require('.\/modules');\nconst app = express();\nasync function startServer() {\n  const server = new ApolloServer({ schema });\n  await server.start();\n  server.applyMiddleware({ app });\n}\nstartServer();\napp.listen({ port: 3000 }, () =&gt;\n  console.log(`Server ready at http:\/\/localhost:3000`)\n);<\/code><\/pre>\n<p>I ovenst\u00e5ende kode har du med succes oprettet din f\u00f8rste CRUD GraphQL-server til Todos og Users. Du kan starte din udviklingsserver og f\u00e5 adgang til legepladsen ved hj\u00e6lp af <a href=\"http:\/\/localhost:300\/graphql\">http:\/\/localhost:3000\/graphql<\/a>. Hvis alt er lykkedes, b\u00f8r du blive pr\u00e6senteret for nedenst\u00e5ende sk\u00e6rm:<\/p>\n<figure style=\"width: 1600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/12\/new_graphql_playground.png\" alt=\"En udviklingsgr\u00e6nseflade, der viser en simpel foresp\u00f8rgsel som svar.\" width=\"1600\" height=\"1116\"><figcaption class=\"wp-caption-text\">Verifikationssk\u00e6rmen.<\/figcaption><\/figure>\n<h2>Oversigt<\/h2>\n<p>GraphQL er en moderne teknologi, der underst\u00f8ttes af Facebook, og som forenkler det kedelige arbejde med at skabe API&#8217;er i stor skala med RESTful-arkitekturm\u00f8nstre.<\/p>\n<p>Denne vejledning har belyst GraphQL og demonstreret, hvordan du udvikler din f\u00f8rste GraphQL API med Express.js.<\/p>\n<p>Lad os vide, hvad du bygger ved hj\u00e6lp af GraphQL i kommentarerne nedenfor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GraphQL er det nye buzzword inden for API-udvikling. Mens RESTful API&#8217;er fortsat er den mest popul\u00e6re m\u00e5de at udstille data fra applikationer p\u00e5, har de mange &#8230;<\/p>\n","protected":false},"author":193,"featured_media":47678,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[706,720],"class_list":["post-47677","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-javascript-tutorials","topic-node-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Opbygning af GraphQL-API&#039;er med Node<\/title>\n<meta name=\"description\" content=\"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Opbygning af GraphQL-API&#039;er med Node\" \/>\n<meta property=\"og:description\" content=\"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-02T11:50:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:12:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Solomon Eseme\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kaperskyguru\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Solomon Eseme\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\"},\"author\":{\"name\":\"Solomon Eseme\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\"},\"headline\":\"Opbygning af GraphQL-API&#8217;er med Node\",\"datePublished\":\"2023-01-02T11:50:43+00:00\",\"dateModified\":\"2023-08-24T10:12:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\"},\"wordCount\":1539,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png\",\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\",\"name\":\"Opbygning af GraphQL-API'er med Node\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png\",\"datePublished\":\"2023-01-02T11:50:43+00:00\",\"dateModified\":\"2023-08-24T10:12:37+00:00\",\"description\":\"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript tutorials\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/javascript-tutorials\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Opbygning af GraphQL-API&#8217;er med Node\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\",\"name\":\"Solomon Eseme\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g\",\"caption\":\"Solomon Eseme\"},\"description\":\"I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me\",\"sameAs\":[\"https:\/\/masteringbackend.com\",\"https:\/\/linkedin.com\/in\/solomoneseme\",\"https:\/\/x.com\/kaperskyguru\"],\"url\":\"https:\/\/kinsta.com\/dk\/blog\/author\/solomoneseme\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Opbygning af GraphQL-API'er med Node","description":"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/","og_locale":"da_DK","og_type":"article","og_title":"Opbygning af GraphQL-API'er med Node","og_description":"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.","og_url":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2023-01-02T11:50:43+00:00","article_modified_time":"2023-08-24T10:12:37+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png","type":"image\/png"}],"author":"Solomon Eseme","twitter_card":"summary_large_image","twitter_description":"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png","twitter_creator":"@kaperskyguru","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Solomon Eseme","Estimeret l\u00e6setid":"10 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/"},"author":{"name":"Solomon Eseme","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2"},"headline":"Opbygning af GraphQL-API&#8217;er med Node","datePublished":"2023-01-02T11:50:43+00:00","dateModified":"2023-08-24T10:12:37+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/"},"wordCount":1539,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png","inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/","url":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/","name":"Opbygning af GraphQL-API'er med Node","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png","datePublished":"2023-01-02T11:50:43+00:00","dateModified":"2023-08-24T10:12:37+00:00","description":"Nysgerrig, hvordan man bruger GraphQL med Node.js? Vi f\u00f8rer dig gennem hele processen her med kodeeksempler og letforst\u00e5elige forklaringer.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/graphql-nodejs.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/graphql-nodejs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"JavaScript tutorials","item":"https:\/\/kinsta.com\/dk\/emner\/javascript-tutorials\/"},{"@type":"ListItem","position":3,"name":"Opbygning af GraphQL-API&#8217;er med Node"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2","name":"Solomon Eseme","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g","caption":"Solomon Eseme"},"description":"I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me","sameAs":["https:\/\/masteringbackend.com","https:\/\/linkedin.com\/in\/solomoneseme","https:\/\/x.com\/kaperskyguru"],"url":"https:\/\/kinsta.com\/dk\/blog\/author\/solomoneseme\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47677","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=47677"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47677\/revisions"}],"predecessor-version":[{"id":48030,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47677\/revisions\/48030"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47677\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/47678"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=47677"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=47677"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=47677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}