{"id":61169,"date":"2023-01-02T12:53:11","date_gmt":"2023-01-02T11:53:11","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=61169&#038;preview=true&#038;preview_id=61169"},"modified":"2023-08-23T17:50:56","modified_gmt":"2023-08-23T15:50:56","slug":"graphql-nodejs","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/","title":{"rendered":"Construir API GraphQL con Node"},"content":{"rendered":"<p>GraphQL es la nueva palabra de moda en el desarrollo de las API. Aunque las API RESTful siguen siendo la forma m\u00e1s popular de exponer los datos de las aplicaciones, tienen muchas limitaciones que GraphQL pretende resolver.<\/p>\n<p>GraphQL es un lenguaje de consulta creado por Facebook, que se convirti\u00f3 en un proyecto de c\u00f3digo abierto en 2015. Ofrece una sintaxis intuitiva y flexible para describir y acceder a los datos de una API.<\/p>\n\n<p>Esta gu\u00eda explorar\u00e1 c\u00f3mo construir un <a href=\"https:\/\/kinsta.com\/es\/blog\/como-instalar-node-js\/\">proyecto Node.js<\/a> con GraphQL. Usaremos GraphQL para construir una aplicaci\u00f3n Todo en el <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-express\/\">framework web Express.js<\/a> para Node.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>\u00bfQu\u00e9 Es GraphQL?<\/h2>\n<p>Seg\u00fan la <a href=\"https:\/\/graphql.org\/\">documentaci\u00f3n oficial<\/a>: \u00abGraphQL es un lenguaje de consulta para API y un tiempo de ejecuci\u00f3n para realizar esas consultas con los datos existentes. GraphQL proporciona una descripci\u00f3n completa y comprensible de los datos de tu API, da a los clientes el poder de pedir exactamente lo que necesitan y nada m\u00e1s, facilita la evoluci\u00f3n de las API con el tiempo y habilita potentes herramientas para desarrolladores.\u00bb<\/p>\n<p>GraphQL es un tiempo de ejecuci\u00f3n del lado del servidor para ejecutar consultas utilizando el sistema de tipos que hayas definido para tus datos. Adem\u00e1s, GraphQL no est\u00e1 vinculado a ninguna base de datos o motor de almacenamiento espec\u00edfico. En su lugar, se apoya en tu c\u00f3digo y almac\u00e9n de datos existentes. Puedes obtener una comparaci\u00f3n detallada de estas tecnolog\u00edas con la <a href=\"https:\/\/kinsta.com\/es\/blog\/graphql-vs-rest\/\">gu\u00eda GraphQL vs. API RESTful<\/a>.<\/p>\n<p>Para crear un servicio GraphQL, empieza definiendo tipos de esquema y creando campos que utilicen esos tipos. A continuaci\u00f3n, proporcionas una funci\u00f3n de resoluci\u00f3n que se ejecutar\u00e1 en cada campo y tipo cada vez que el cliente solicite datos.<\/p>\n<h2>Terminolog\u00eda GraphQL<\/h2>\n<p>El sistema de tipos GraphQL se utiliza para describir qu\u00e9 datos se pueden consultar y qu\u00e9 datos se pueden manipular. Es el core de GraphQL. Vamos a discutir las diferentes formas en que podemos describir y manipular datos en GraphQL.<\/p>\n<h3>Tipos de Objeto<\/h3>\n<p>Los tipos de objetos GraphQL son modelos de datos que contienen campos fuertemente tipificados. Debe haber una correspondencia 1 a 1 entre tus modelos y los tipos GraphQL. A continuaci\u00f3n se muestra un ejemplo de Tipo GraphQL:<\/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>Consultas<\/h3>\n<p>GraphQL Query define todas las consultas que un cliente puede ejecutar en la API GraphQL. Debes definir un <code>RootQuery<\/code> que contendr\u00e1 todas las consultas existentes por convenci\u00f3n.<\/p>\n<p>A continuaci\u00f3n definimos y asignamos las consultas a la correspondiente API RESTful:<\/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>Mutaciones<\/h3>\n<p>Si las Consultas GraphQL son peticiones <code>GET<\/code>, las mutaciones son peticiones <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code>, y <code>DELETE<\/code> que manipulan la API GraphQL.<\/p>\n<p>Pondremos todas las mutaciones en un \u00fanico <code>RootMutation<\/code> para demostrarlo:<\/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>Ya has comprobado el uso de tipos <code>-input<\/code> para las mutaciones como <code>UserInput<\/code>, <code>TodoInput<\/code>. Siempre es la mejor pr\u00e1ctica para definir los tipos de entrada para la creaci\u00f3n y actualizaci\u00f3n de tus recursos.<\/p>\n<p>Puedes definir los tipos de entrada como se indica a continuaci\u00f3n:<\/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>Los Resolvers le dicen a GraphQL qu\u00e9 hacer cuando se solicita cada consulta o mutaci\u00f3n. Es una funci\u00f3n b\u00e1sica que hace el trabajo duro de acceder a la capa de base de datos para realizar las operaciones CRUD (crear, leer, actualizar, eliminar), acceder a un punto final RESTful API interno o llamar a un <a href=\"https:\/\/kinsta.com\/es\/blog\/microservicios-vs-api\/\">microservicio<\/a> para satisfacer la solicitud del cliente.<\/p>\n<p>Puedes crear un nuevo archivo <strong>resolvers.js<\/strong> y a\u00f1adir el siguiente c\u00f3digo:<\/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>Esquema<\/h3>\n<p>El esquema GraphQL es lo que GraphQL expone al mundo. Por lo tanto, los tipos, consultas y mutaciones se incluir\u00e1n dentro del esquema para ser expuestos al mundo.<\/p>\n<p>A continuaci\u00f3n se explica c\u00f3mo exponer al mundo los tipos, consultas y mutaciones:<\/p>\n<pre><code class=\"language-json\">schema {\n  query: RootQuery\n  mutation: RootMutation\n}<\/code><\/pre>\n<p>En el script anterior, incluimos el <code>RootQuery<\/code> y el <code>RootMutation<\/code> que creamos anteriormente para exponerlos al mundo.<\/p>\n<h2>\u00bfC\u00f3mo Funciona GraphQL con Node.js y Express.js?<\/h2>\n<p>GraphQL proporciona una implementaci\u00f3n para los principales lenguajes de programaci\u00f3n, y Node.js no est\u00e1 exento. En el <a href=\"https:\/\/graphql.org\/\">sitio web oficial de GraphQL<\/a>, hay una secci\u00f3n para la <a href=\"https:\/\/graphql.org\/code\/#javascript\">compatibilidad con JavaScript<\/a>, y adem\u00e1s, hay otras implementaciones de GraphQL para simplificar la escritura y la programaci\u00f3n.<\/p>\n<p>GraphQL Apollo proporciona una implementaci\u00f3n para Node.js y Express.js y facilita los primeros pasos con GraphQL.<\/p>\n<p>En la siguiente secci\u00f3n aprender\u00e1s a crear y desarrollar tu primera aplicaci\u00f3n GraphQL en Node.js y el framework backend <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-express\/\">Express.js<\/a> utilizando GraphQL Apollo.<\/p>\n<h2>Configurar GraphQL con Express.js<\/h2>\n<p>Construir un servidor API GraphQL con Express.js es sencillo para comenzar. En esta secci\u00f3n, exploraremos c\u00f3mo construir un servidor GraphQL.<\/p>\n<h3>Inicializar el Proyecto con Express<\/h3>\n<p>En primer lugar, necesitas instalar y configurar un nuevo proyecto Express.js. Crea una carpeta para tu proyecto e instala Express.js utilizando este comando:<\/p>\n<pre><code class=\"language-bash\">cd &lt;project-name&gt; && npm init -y\nnpm install express<\/code><\/pre>\n<p>El comando anterior crea un nuevo archivo <strong>package.json<\/strong> e instala la biblioteca Express.js en tu proyecto.<\/p>\n<p>A continuaci\u00f3n, estructuraremos nuestro proyecto como se muestra en la siguiente imagen. Contendr\u00e1 diferentes m\u00f3dulos para las caracter\u00edsticas del proyecto, como usuarios, todos, etc.<\/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=\"Una lista de archivos en graphql-todo.\" width=\"467\" height=\"595\"><figcaption class=\"wp-caption-text\">Archivos para <em>graphql-todo<\/em>.<\/figcaption><\/figure>\n<h3>Inicializar GraphQL<\/h3>\n<p>Comencemos instalando las dependencias de GraphQL Express.js. Ejecuta el siguiente comando para instalar:<\/p>\n<pre><code class=\"language-bash\">npm install apollo-server-express graphql @graphql-tools\/schema --save<\/code><\/pre>\n<h3>Crear Esquemas y Tipos<\/h3>\n<p>A continuaci\u00f3n, vamos a crear un archivo <strong>index.js<\/strong> dentro de la carpeta modules y a a\u00f1adir el siguiente fragmento de c\u00f3digo:<\/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>Recorrido del C\u00f3digo<\/h4>\n<p>Vamos a trabajar con el fragmento de c\u00f3digo y a desglosarlo:<\/p>\n<h5>Paso 1<\/h5>\n<p>En primer lugar, importamos las bibliotecas necesarias y creamos los tipos de consulta y mutaci\u00f3n predeterminados. Por ahora, la consulta y la mutaci\u00f3n s\u00f3lo establecen la versi\u00f3n de la API GraphQL. Sin embargo, ampliaremos la consulta y la mutaci\u00f3n para incluir otros esquemas a medida que avancemos.<\/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=\"Una interfaz de l\u00ednea de comandos que muestra el c\u00f3digo \"const\" para importar GraphQL y otras extensiones.\" width=\"1266\" height=\"904\"><figcaption class=\"wp-caption-text\">Importaci\u00f3n de GraphQL y extensiones.<\/figcaption><\/figure>\n<h5>Paso 2:<\/h5>\n<p>A continuaci\u00f3n creamos un nuevo tipo escalar para el tiempo y nuestro primer resolver para la consulta y mutaci\u00f3n creadas anteriormente. Adem\u00e1s, tambi\u00e9n generamos un esquema utilizando la funci\u00f3n <code>makeExecutableSchema<\/code>.<\/p>\n<p>El esquema generado incluye todos los dem\u00e1s esquemas que importamos y tambi\u00e9n incluir\u00e1 m\u00e1s cuando los creemos e importemos.<\/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=\"Una interfaz de l\u00ednea de comandos que muestra el c\u00f3digo \"const\" para crear nuestro tipo escalar y nuestro primer resolver.\" width=\"1166\" height=\"1012\"><figcaption class=\"wp-caption-text\">Creamos un tipo escalar para el tiempo, as\u00ed como nuestro primer resolver.<\/figcaption><\/figure>\n<p>El fragmento de c\u00f3digo anterior muestra que hemos importado diferentes esquemas en la funci\u00f3n makeExecutableSchema. Este enfoque nos ayuda a estructurar la aplicaci\u00f3n para que sea m\u00e1s compleja. A continuaci\u00f3n, vamos a crear los esquemas Todo y Usuario que hemos importado.<\/p>\n<h3>Creaci\u00f3n del Esquema Todo<\/h3>\n<p>El esquema Todo muestra operaciones CRUD sencillas que pueden realizar los usuarios de la aplicaci\u00f3n. A continuaci\u00f3n se muestra el esquema que implementa la operaci\u00f3n CRUD Todo.<\/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>Recorrido del C\u00f3digo<\/h4>\n<p>Analicemos el fragmento de c\u00f3digo y desglos\u00e9moslo:<\/p>\n<h5>Paso 1:<\/h5>\n<p>En primer lugar, creamos un esquema para nuestro Todo utilizando GraphQL <code>type<\/code>, <code>input<\/code>, y <code>extend<\/code>. La palabra clave <code>extend<\/code> se utiliza para heredar y a\u00f1adir nuevas consultas y mutaciones a la consulta root y mutaci\u00f3n existentes que creamos anteriormente.<\/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=\"Una interfaz de l\u00ednea de comandos que muestra el esquema de nuestro script Todo, incluyendo nuevas entradas.\" width=\"1092\" height=\"1408\"><figcaption class=\"wp-caption-text\">Creando el esquema para nuestro Todo.<\/figcaption><\/figure>\n<h5>Paso 2:<\/h5>\n<p>A continuaci\u00f3n, creamos un resolver, que se utiliza para recuperar los datos correctos cuando se llama a una consulta o mutaci\u00f3n determinada.<\/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=\"Una interfaz de l\u00ednea de comandos que muestra el c\u00f3digo para crear un resolver para nuestro Todo.\" width=\"1092\" height=\"904\"><figcaption class=\"wp-caption-text\">Creaci\u00f3n de un resolver.<\/figcaption><\/figure>\n<p>Una vez creada la funci\u00f3n resolver, podemos crear m\u00e9todos individuales para la l\u00f3gica de negocio y la manipulaci\u00f3n de la base de datos, como se muestra en el ejemplo <strong>create-todo.js<\/strong>.<\/p>\n<p>Crea un archivo <strong>create-user.js<\/strong> en la carpeta <code>.\/mutations<\/code> y a\u00f1ade la l\u00f3gica de negocio para crear un nuevo Todo en tu base de datos.<\/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>El fragmento de c\u00f3digo anterior es una forma simplificada de crear un nuevo Todo en nuestra base de datos utilizando el ORM Sequelize. Puedes obtener m\u00e1s informaci\u00f3n sobre <a href=\"https:\/\/sequelize.org\/\">Sequelize y c\u00f3mo configurarlo con Node.js<\/a>.<\/p>\n<p>Puedes seguir el mismo paso para crear muchos esquemas dependiendo de tu aplicaci\u00f3n o puedes <a href=\"https:\/\/github.com\/Kaperskyguru\/graphql-todo-example\">clonar el proyecto completo desde GitHub<\/a>.<\/p>\n<p>A continuaci\u00f3n, vamos a configurar el servidor con Express.js y ejecutar la aplicaci\u00f3n Todo reci\u00e9n creada con GraphQL y Node.js.<\/p>\n<h3>Configurar y Ejecutar el Servidor<\/h3>\n<p>Por \u00faltimo, vamos a configurar nuestro servidor utilizando la biblioteca <code>apollo-server-express<\/code> que instalamos anteriormente y configurarlo.<\/p>\n<p><code>apollo-server-express<\/code> es un simple wrapper del Servidor Apollo para Express.js, se recomienda porque ha sido desarrollado para adaptarse en el desarrollo de Express.js.<\/p>\n<p>Utilizando los ejemplos que hemos comentado anteriormente, vamos a configurar el servidor Express.js para que funcione con la reci\u00e9n instalada <code>apollo-server-express<\/code>.<\/p>\n<p>Crea un archivo <strong>server.js<\/strong> en el directorio root y pega el siguiente c\u00f3digo:<\/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>Con el c\u00f3digo anterior, has creado con \u00e9xito tu primer servidor CRUD GraphQL para Todos y Usuarios. Puedes iniciar tu servidor de desarrollo y acceder al playground utilizando <a href=\"http:\/\/localhost:300\/graphql\">http:\/\/localhost:3000\/graphql<\/a>. Si todo va bien, deber\u00eda aparecerte la siguiente pantalla:<\/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=\"Una interfaz de desarrollo que muestra una consulta simple en respuesta.\" width=\"1600\" height=\"1116\"><figcaption class=\"wp-caption-text\">La pantalla de verificaci\u00f3n.<\/figcaption><\/figure>\n<h2>Resumen<\/h2>\n<p>GraphQL es una tecnolog\u00eda moderna respaldada por Facebook que simplifica el tedioso trabajo que supone crear API a gran escala con patrones arquitect\u00f3nicos RESTful.<\/p>\n\n<p>Esta gu\u00eda ha esclarecido GraphQL y demostrado c\u00f3mo desarrollar tu primera API GraphQL con Express.js.<\/p>\n<p>Haznos saber qu\u00e9 construyes utilizando GraphQL en los comentarios a continuaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GraphQL es la nueva palabra de moda en el desarrollo de las API. Aunque las API RESTful siguen siendo la forma m\u00e1s popular de exponer los &#8230;<\/p>\n","protected":false},"author":193,"featured_media":61170,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1311],"class_list":["post-61169","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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>Construir API GraphQL con Node<\/title>\n<meta name=\"description\" content=\"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.\" \/>\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\/es\/blog\/graphql-nodejs\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Construir API GraphQL con Node\" \/>\n<meta property=\"og:description\" content=\"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-02T11:53:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-23T15:50:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/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=\"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kaperskyguru\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Solomon Eseme\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/\"},\"author\":{\"name\":\"Solomon Eseme\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\"},\"headline\":\"Construir API GraphQL con Node\",\"datePublished\":\"2023-01-02T11:53:11+00:00\",\"dateModified\":\"2023-08-23T15:50:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/\"},\"wordCount\":1627,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/\",\"name\":\"Construir API GraphQL con Node\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png\",\"datePublished\":\"2023-01-02T11:53:11+00:00\",\"dateModified\":\"2023-08-23T15:50:56+00:00\",\"description\":\"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/node-js\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Construir API GraphQL con Node\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"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\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\",\"name\":\"Solomon Eseme\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/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\/es\/blog\/author\/solomoneseme\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Construir API GraphQL con Node","description":"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.","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\/es\/blog\/graphql-nodejs\/","og_locale":"es_ES","og_type":"article","og_title":"Construir API GraphQL con Node","og_description":"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.","og_url":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2023-01-02T11:53:11+00:00","article_modified_time":"2023-08-23T15:50:56+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png","type":"image\/png"}],"author":"Solomon Eseme","twitter_card":"summary_large_image","twitter_description":"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png","twitter_creator":"@kaperskyguru","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Solomon Eseme","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/"},"author":{"name":"Solomon Eseme","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2"},"headline":"Construir API GraphQL con Node","datePublished":"2023-01-02T11:53:11+00:00","dateModified":"2023-08-23T15:50:56+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/"},"wordCount":1627,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/","url":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/","name":"Construir API GraphQL con Node","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png","datePublished":"2023-01-02T11:53:11+00:00","dateModified":"2023-08-23T15:50:56+00:00","description":"\u00bfTienes curiosidad por saber c\u00f3mo usar GraphQL con Node.js? Aqu\u00ed te guiaremos a trav\u00e9s de todo el proceso con ejemplos de c\u00f3digo y explicaciones f\u00e1ciles de entender.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/01\/graphql-nodejs.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/graphql-nodejs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Node.js","item":"https:\/\/kinsta.com\/es\/secciones\/node-js\/"},{"@type":"ListItem","position":3,"name":"Construir API GraphQL con Node"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","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\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2","name":"Solomon Eseme","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/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\/es\/blog\/author\/solomoneseme\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/61169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=61169"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/61169\/revisions"}],"predecessor-version":[{"id":77929,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/61169\/revisions\/77929"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/translations\/dk"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/61169\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/61170"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=61169"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=61169"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=61169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}