{"id":8219,"date":"2020-02-28T16:03:38","date_gmt":"2020-02-29T00:03:38","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8219"},"modified":"2025-06-13T21:10:25","modified_gmt":"2025-06-14T04:10:25","slug":"fullstack-react-express-2","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-express-2\/","title":{"rendered":"Fullstack React y GraphQL : Servidor Express"},"content":{"rendered":"<p>El segundo de tres art\u00edculos centrados en la construcci\u00f3n Fullstack React y GraphQL con Express y Couchbase Server.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-couchbase-1\/\">Configuraci\u00f3n de un servidor NoSQL Couchbase (Parte 1)<\/a><\/li>\n<li>Creaci\u00f3n de una API Express-GraphQL (Parte 2)<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-apollo-3\/\">Crear un cliente Apollo GraphQL en React (Parte 3)<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/rage-with-couchbase-final\">C\u00f3digo fuente final<\/a><\/li>\n<\/ul>\n<h2 id=\"graphql-with-express\">GraphQL con Express<\/h2>\n<p>Si no est\u00e1 familiarizado con GraphQL, t\u00f3mese unos minutos para ponerse al d\u00eda utilizando la documentaci\u00f3n GraphQL. Las siguientes p\u00e1ginas deber\u00edan ser un buen comienzo:<\/p>\n<ul>\n<li><a href=\"https:\/\/graphql.org\/learn\/\">Introducci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/graphql.org\/learn\/queries\/\">Consultas y mutaciones<\/a><\/li>\n<li><a href=\"https:\/\/graphql.org\/learn\/schema\/\">Esquemas y tipos<\/a><\/li>\n<\/ul>\n<h3 id=\"create-project-structure\">Requisitos previos<\/h3>\n<ul class=\"p-rich_text_list p-rich_text_list__bullet\" data-stringify-type=\"unordered-list\" data-indent=\"0\">\n<li data-stringify-indent=\"0\"><a class=\"c-link\" href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-stringify-link=\"https:\/\/nodejs.org\/\" data-sk=\"tooltip_parent\">nodo<\/a>\u00a0v10.x o posterior<\/li>\n<li data-stringify-indent=\"0\"><a class=\"c-link\" href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-stringify-link=\"https:\/\/www.npmjs.com\/\" data-sk=\"tooltip_parent\">npm<\/a>\u00a0v5.x o posterior<\/li>\n<li data-stringify-indent=\"0\"><a class=\"c-link\" href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-stringify-link=\"https:\/\/git-scm.com\/\" data-sk=\"tooltip_parent\">git<\/a>\u00a0v2.14.1 o posterior<\/li>\n<\/ul>\n<h3 id=\"create-project-structure\">Crear la estructura del proyecto<\/h3>\n<p>Necesitamos crear un directorio en tu m\u00e1quina para nuestro proyecto, lo llamaremos <code>rage-with-couchbase<\/code>:<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-bash\">mkdir rage-with-couchbase &amp;&amp; cd $_<\/code><\/pre>\n<p><code>mkdir<\/code> crear\u00e1 un nuevo directorio utilizando la cadena <code>rage-with-couchbase<\/code> para el nombre de la carpeta, bash almacena esa cadena en una variable que podemos utilizar inmediatamente llamada <code>$_<\/code>.<\/p>\n<p>cambiamos de directorio con <code>$_<\/code> asegur\u00e1ndonos de no escribir mal el directorio en el comando concatenado (es magia de bash).<\/p>\n<p>Ahora vamos a crear un <code>.gitignore<\/code> en la ra\u00edz de nuestro proyecto.<\/p>\n<pre class=\"highlight decode:true\"><code>touch .gitignore &amp;&amp; echo \"\/node_modules\/*\" &gt;&gt; .gitignore<\/code><\/pre>\n<p><code>toque<\/code> generar\u00e1 un <code>.gitignore<\/code> ignorando todos los <code>node_modules<\/code> en nuestro proyecto. Esto es importante porque como parte de nuestro proyecto de demostraci\u00f3n fullstack React y GraphQL, estaremos rastreando cambios git desde la ra\u00edz <code>rage-with-couchbase<\/code> pero tendremos directorios de servidor y cliente con sus propios <code>paquete.json<\/code> y <code>node_modules<\/code> directorio.<\/p>\n<p><code>echo<\/code> a\u00f1adir\u00e1 el <code>node_modules\/<\/code> texto dentro del <code>.gitignore<\/code> esto servir\u00e1 para ignorar todos los <strong>node_modules<\/strong> en la ra\u00edz y en todos los subdirectorios.<\/p>\n<h3 id=\"creating-our-express-server\">Creaci\u00f3n de nuestro servidor Express<\/h3>\n<p>Ahora crearemos el directorio para almacenar nuestro servidor Express y usaremos npm para gestionar sus paquetes.<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-bash\">mkdir couchbase-gql-server &amp;&amp; cd $_ &amp;&amp; npm init -y<\/code><\/pre>\n<p><code>mkdir<\/code> crear\u00e1 una nueva carpeta dentro de la ra\u00edz del proyecto espec\u00edficamente para nuestro servidor utilizando la cadena <code>servidor couchbase-gql<\/code> para el nombre, este es el directorio del proyecto de su servidor.<\/p>\n<p>cambiamos de directorio y utilizamos <code>$_<\/code> (m\u00e1s magia) y luego inicializamos un <strong>npm<\/strong> proyecto utilizando <code>npm init -y<\/code> aceptando los valores por defecto con el <code>-y<\/code> bandera.<\/p>\n<h3 id=\"install-express-server-dependencies\">Instalar dependencias de Express Server<\/h3>\n<pre class=\"highlight decode:true\"><code class=\"language-bash\">npm install graphql express express-graphql couchbase &amp;&amp; npm install nodemon -D &amp;&amp; code .<\/code><\/pre>\n<p>Una vez finalizada la instalaci\u00f3n, tenemos que abrir nuestro proyecto con nuestro editor de elecci\u00f3n. Yo prefiero VS Code.<\/p>\n<h3 id=\"create-our-graphql-server\">Crear nuestro servidor GraphQL<\/h3>\n<pre class=\"highlight decode:true\"><code class=\"language-bash\">touch server.js .gitignore &amp;&amp; echo \"\/node_modules\/*\" &gt;&gt; .gitignore<\/code><\/pre>\n<p>Requerir <code>express\/express-graphql\/graphql<\/code> en nuestro <code>servidor.js<\/code> file:<\/p>\n<pre><code class=\"language-JavaScript\">const express = require('express')\r\nconst { graphqlHTTP } = require('express-graphql')\r\nconst { buildSchema } = require('graphql')\r\n    \r\nconst couchbase = require('couchbase')<\/code><\/pre>\n<p>Las tres primeras importaciones son necesarias para nuestro servidor GraphQL y la \u00faltima importaci\u00f3n es necesaria para conectar y consultar nuestro servidor Couchbase.<\/p>\n<h3 id=\"initialize-express-and-connect-to-our-bucket\">Inicializar Express y conectarse a nuestro cubo<\/h3>\n<p>A\u00f1ade el siguiente c\u00f3digo:<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">const app = express()\r\nconst cluster = new couchbase.Cluster('couchbase:\/\/localhost', { \r\n  username: 'Administrator', password: 'password' \r\n})\r\nconst bucket = cluster.bucket('travel-sample')\r\nvar collection = bucket.defaultCollection();<\/code><\/pre>\n<p>Arriba estamos conectando a nuestro cluster de Couchbase Server, autenticando con nuestro usuario que configuramos, y abriendo nuestro <code>viaje-muestra<\/code> cubo. Nunca utilice nombres de usuario y contrase\u00f1as por defecto en aplicaciones de producci\u00f3n.<\/p>\n<h3 id=\"create-our-graphql-schema\">Crear nuestro esquema GraphQL<\/h3>\n<p>A\u00f1adiendo el siguiente c\u00f3digo definiremos dos endpoints que permitir\u00e1n a nuestro GraphQL Server acceder y recuperar datos de nuestros documentos dentro de nuestro bucket de Couchbase Server.<\/p>\n<pre><code class=\"language-JavaScript\">const schema = buildSchema(`\r\n  type Airline {\r\n    id: Int,\r\n    callsign: String,\r\n    country: String,\r\n    iata: String,\r\n    icao: String,\r\n    name: String,\r\n    type: String\r\n  }\r\n  input AirlineInput {\r\n    callsign: String,\r\n    country: String,\r\n    iata: String,\r\n    icao: String,\r\n    name: String,\r\n    type: String\r\n  }\r\n  type Query {\r\n    airlinesUK: [Airline],\r\n    airlineByKey(id: Int!): Airline\r\n    airlinesByRegion(region: String!): [Airline]\r\n  }\r\n  type Mutation {\r\n    updateAirline(id: Int!, input: AirlineInput): Airline\r\n  }<\/code><\/pre>\n<p>En <code>Consulta<\/code> especifica qu\u00e9 <a href=\"https:\/\/www.couchbase.com\/blog\/es\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\">Consultas GraphQL<\/a> pueden ejecutar contra su propio gr\u00e1fico de datos.<\/p>\n<p>Tenemos dos puntos finales definidos por <code>Consulta<\/code>. Uno llamado \"airlinesUK\" y el otro \"airlineByKey\". En nuestra aplicaci\u00f3n React, s\u00f3lo utilizaremos el endpoint \"airlinesUK\". Hice el endpoint \"airlineByKey\" simplemente para mostrar un ejemplo de recuperaci\u00f3n de un \u00fanico documento Couchbase por clave. Esta operaci\u00f3n no utiliza el lenguaje de consulta N1QL y por lo tanto no tiene ninguna sobrecarga adicional. Entender cu\u00e1ndo y d\u00f3nde usar cada uno es importante desde la perspectiva de la construcci\u00f3n de la API, no querr\u00edamos usar una consulta N1QL para devolver un \u00fanico documento que podemos obtener por clave.<\/p>\n<p>En nuestro c\u00f3digo GraphQL, tenemos un objeto de tipo <code>L\u00ednea a\u00e9rea<\/code>. This object model the document structure found in our Couchbase `travel-sample` bucket where the type is &#8220;airline&#8221;.<\/p>\n<p>A continuaci\u00f3n, tenemos un Endpoint llamado \"<code>compa\u00f1\u00edas a\u00e9reasUK<\/code>\". Observe que el valor de retorno de este punto final es una matriz de Aerol\u00edneas: <code>[Aerol\u00ednea]<\/code>. Esto significa que volveremos a recibir una lista de compa\u00f1\u00edas a\u00e9reas.<\/p>\n<p>Tambi\u00e9n tenemos \"<code>airlineByKey<\/code>\"donde obtendremos un \u00fanico archivo <code>L\u00ednea a\u00e9rea<\/code>.<\/p>\n<p>Si recuerda nuestras im\u00e1genes de Bucket anteriores, cada documento se define mediante una clave con un formato como el siguiente <code>aerol\u00ednea_1234<\/code> donde <code>1234<\/code> es el <code>id<\/code> de la compa\u00f1\u00eda a\u00e9rea.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/01\/travel-sample-document.jpg\" alt=\"travel-sample document\" \/><\/p>\n<p>Mantendremos este <code>id<\/code> a la hora de utilizar el SDK de NodeJS para obtener nuestro <code>airlineByKey<\/code> utilizando un simple <code>bucket.get()<\/code> m\u00e9todo.<\/p>\n<h3 id=\"create-our-resolver-implementation-for-each-endpoint\">Crear nuestra implementaci\u00f3n de Resolver para cada punto final<\/h3>\n<p>Ahora, que hemos definido dos consultas en nuestra API GraphQL-Express utilizando nuestro <code>esquema<\/code> necesitamos una implementaci\u00f3n en JavaScript para recuperar los datos.<\/p>\n<p>Nuestra aplicaci\u00f3n React que vamos a crear s\u00f3lo necesitar\u00e1 el archivo <strong>N1QL<\/strong> consulta denominada <code>compa\u00f1\u00edas a\u00e9reasUK<\/code>.<\/p>\n<p>Pero quer\u00eda mostrarte c\u00f3mo consultar sin <strong>N1QL<\/strong> utilizando la API del SDK de NodeJS utilizando s\u00f3lo una clave o extendi\u00e9ndola para utilizar una regi\u00f3n (US\/UK, etc..), que es la <code>airlineByKey<\/code> y <code>airlineByRegion<\/code> aplicaci\u00f3n.<\/p>\n<p>A\u00f1ada el siguiente c\u00f3digo a nuestro <code>servidor.js<\/code> para nuestras consultas N1QL:<br \/>\n(En su c\u00f3digo JS, aseg\u00farese de escapar los backticks con barras invertidas)<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">\/\/ Define N1QL Queries\r\nconst airlinesUkQuery = `\r\n  SELECT airline.* \r\n  FROM \\`travel-sample\\` AS airline \r\n  WHERE airline.type = 'airline'\r\n  AND airline.country = 'United Kingdom'\r\n`\r\nconst airlinesByRegionQuery = `\r\n  SELECT airline.* \r\n  FROM \\`travel-sample\\` AS airline \r\n  WHERE airline.type = 'airline'\r\n    AND airline.country = $REGION\r\n`<\/code><\/pre>\n<p>A\u00f1ada el siguiente c\u00f3digo a nuestro <code>servidor.js<\/code> para nuestros resolvedores GraphQL:<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">const root = {\r\n  airlinesUK: async () =&gt; {\r\n    const result = await cluster.query(airlinesUkQuery)\r\n    return result.rows\r\n  },\r\n  \/*\r\n    query getAirlinesUK {\r\n      airlinesUK {\r\n        id\r\n        name\r\n        callsign\r\n        country\r\n        iata\r\n        icao\r\n      }\r\n    }\r\n  *\/\r\n  airlinesByRegion: async ({region}) =&gt; {\r\n    const options = { parameters: { REGION: region } }\r\n    const result = await cluster.query(airlinesByRegionQuery, options)\r\n    return result.rows\r\n  },\r\n  \/*\r\n    query getAirlinesByRegion($region: String!) {\r\n      airlinesByRegion(region:$region) {\r\n        id\r\n        name\r\n        callsign\r\n        country\r\n        iata\r\n        icao\r\n      }\r\n    }\r\n    {\r\n      \"region\": \"{{country}}\"\r\n    }\r\n  *\/\r\n  airlineByKey: async ({id}) =&gt; {\r\n    const result = await collection.get(`airline_${id}`)\r\n    return result.value\r\n  },\r\n  \/*\r\n    query getAirlineByKey($id: Int!) {\r\n      airlineByKey(id:$id) {\r\n        id\r\n        name\r\n        callsign\r\n        country\r\n        iata\r\n        icao\r\n      }\r\n    }\r\n    {\r\n      \"id\": {{id}}\r\n    }\r\n  *\/\r\n  updateAirline: async ({id, input}) =&gt; {\r\n    const result = await collection.get(`airline_${id}`)\r\n\r\n    const newDocument = {\r\n      ...result.content, \r\n      callsign: input.callsign ? input.callsign : result.value.callsign,\r\n      country: input.country ? input.country : result.value.country,\r\n      iata: input.iata ? input.iata : result.value.iata,\r\n      icao: input.icao ? input.icao : result.value.icao,\r\n      name: input.name ? input.name : result.value.name,\r\n    };\r\n\r\n    console.log(newDocument)\r\n\r\n    await collection.upsert(`airline_${id}`, newDocument)\r\n    return newDocument\r\n  }\r\n  \/*\r\n    mutation updateExistingAirline($id:Int!, $input:AirlineInput) {\r\n      updateAirline(id:$id, input:$input){\r\n        callsign\r\n        country\r\n        iata\r\n      }\r\n    }\r\n    {\r\n      \"id\": 112,\r\n      \"input\": {\r\n        \"callsign\": \"FLYSTAR\",\r\n        \"country\": \"United Kingdom\"\r\n      }\r\n    }\r\n  *\/\r\n}<\/code><\/pre>\n<p>Nota: En la sentencia N1QL anterior, tendr\u00e1 que escapar los puntos suspensivos en la l\u00ednea FROM alrededor de <code>`viaje-muestra<\/code> con barras invertidas. El ejemplo de c\u00f3digo de nuestro blog no muestra esas barras invertidas, pero est\u00e1n ah\u00ed y se encuentran en el archivo <a href=\"https:\/\/github.com\/httpJunkie\/rage-with-couchbase-final\">C\u00f3digo fuente final<\/a><\/p>\n<p>Para entenderlo mejor, estamos utilizando dos m\u00e9todos diferentes para consultar nuestro servidor Couchbase.<\/p>\n<p>El primer m\u00e9todo corresponde al <code>compa\u00f1\u00edas a\u00e9reasUK<\/code> endpoint, este es su resolver. Necesitamos devolver una promesa y dentro confiar en <code>bucket.query<\/code>para tomar una consulta N1QL predefinida que he desglosado l\u00ednea por l\u00ednea en la variable statement para facilitar la lectura. Poder ejecutar este tipo de consulta SQL es muy potente para una base de datos de documentos. Gran parte del SQL que conocemos se transfiere y esto es un gran alivio en comparaci\u00f3n con otras bases de datos de documentos que tienen una nueva API y un lenguaje de consulta que tendr\u00e1s que aprender.<\/p>\n<p>El segundo m\u00e9todo corresponde al <code>compa\u00f1\u00edas a\u00e9reasUK<\/code> endpoint, este es su resolver. Necesitamos devolver una promesa y dentro confiar en <code>cubo.get<\/code> y en este caso, s\u00f3lo estamos definiendo la clave de nuestro documento. Recuerde que una de las grandes cosas sobre el uso de un almac\u00e9n de datos clave-valor es que podemos elegir f\u00e1cilmente un solo documento con poca sobrecarga.<\/p>\n<p>Cada uno de los m\u00e9todos anteriores tambi\u00e9n comprueba si hay errores de consulta y los resuelve o los rechaza en funci\u00f3n de un valor de <code>resultado<\/code> o <code>error<\/code>.<\/p>\n<h3 id=\"creating-our-express-graphql-server\">Creaci\u00f3n de nuestro GraphQL con Express Server<\/h3>\n<p>Ahora que tenemos todo resuelto para nuestros puntos finales y consultas, todo lo que tenemos que hacer es <code>utilice<\/code> nuestro servidor Express y darle un puerto para ejecutar, vamos a hacer eso ahora.<\/p>\n<p>A\u00f1ade el siguiente c\u00f3digo al final de nuestro <code>servidor.js<\/code> file:<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">\/*  \r\n  The graphqlHTTP function accepts a schema, rootValue and graphiql \r\n    among other options for configuring our GraphQL Server \r\n*\/\r\nconst serverPort = 4000\r\nconst serverUrl = '\/graphql'\r\napp.use(serverUrl, graphqlHTTP({\r\n  schema: schema,\r\n  rootValue: root,\r\n  graphiql: true\r\n}))\r\n\r\napp.listen(\r\n  serverPort, \r\n  () =&gt; console.log(`GraphQL server running: https:\/\/localhost:${serverPort}${serverUrl}`)\r\n)<\/code><\/pre>\n<p>Si alguna vez has creado un servidor Express o Express-GraphQL, este c\u00f3digo deber\u00eda resultarte familiar.<\/p>\n<p>En primer lugar, configuramos nuestro puerto y URL GraphQL.<\/p>\n<p>A continuaci\u00f3n, pasamos nuestro esquema GraphQL y sus resolvers y establecemos nuestro <code>graphiql<\/code> a true. (Esto nos dar\u00e1 un IDE para probar nuestras consultas GraphQL disponibles en <a href=\"https:\/\/localhost:4000\/graphql\">localhost:4000\/graphql<\/a>.<\/p>\n<p>Por \u00faltimo, escuchamos en el puerto 4000 y ponemos un mensaje en la consola para indicar que nuestro servidor se est\u00e1 ejecutando.<\/p>\n<p>Vamos a ejecutar nuestro servidor, aseg\u00farese de que su Couchbase:<\/p>\n<pre class=\"highlight decode:true\"><code class=\"language-bash\">nodo servidor<\/code><\/pre>\n<p>Una vez que tenemos el servidor GraphQL en funcionamiento podemos probar la aplicaci\u00f3n <code>Compa\u00f1\u00edas a\u00e9reasUK<\/code> pegando el siguiente c\u00f3digo en el panel de consultas de GraphQL IDE:<\/p>\n<pre><code class=\"language-graphiQL\">query getAirlinesUK{\r\n  airlinesUK {\r\n    id\r\n    name\r\n    callsign\r\n    country\r\n    iata\r\n    icao\r\n  }\r\n}<\/code><\/pre>\n<p>Como indica la consulta, recuperar\u00e1 todas las compa\u00f1\u00edas a\u00e9reas con base en el Reino Unido:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/01\/travel-sample-graphiql-airlinesUK.jpg\" alt=\"GraphQL with Express GraphiQL demo all UK airlines\" \/><\/p>\n<p>A continuaci\u00f3n, utilizaremos la funci\u00f3n <code>airlineByKey<\/code> en este ejemplo, tambi\u00e9n tendremos que crear una variable de consulta y pegarla en el panel correspondiente:<\/p>\n<pre><code class=\"language-graphiQL\">query getAirlineByKey($id: Int!) {\r\n  airlineByKey(id:$id){\r\n    id\r\n    name\r\n    callsign\r\n    country\r\n    iata\r\n    icao\r\n  }\r\n}<\/code><\/pre>\n<pre><code class=\"language-graphiQL\">{\r\n  \"id\": 112\r\n}<\/code><\/pre>\n<p>Y con eso en su lugar y podemos consultar de nuevo y recuperar un solo documento de la aerol\u00ednea por clave:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/01\/travel-sample-graphiql-airlineByKey.jpg\" alt=\"GraphQL with Express GraphiQL demo UK airline by key\" \/><\/p>\n<p>Con una configuraci\u00f3n super sencilla de la API GraphQL, estamos listos para <a href=\"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-apollo-3\/\">crear nuestra aplicaci\u00f3n react<\/a> que utilizar\u00e1 estos endpoints para una p\u00e1gina maestro-detalle utilizando las aerol\u00edneas del Reino Unido en un componente de lista y cuando hagamos clic en una aerol\u00ednea en particular, otro componente mostrar\u00e1 los detalles completos de la aerol\u00ednea en la parte derecha de la p\u00e1gina.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-apollo-3\/\">Crear un cliente Apollo GraphQL en React (Parte 3)<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>The second of three articles focused on building Fullstack React and GraphQL with Express and Couchbase Server. Setting up a NoSQL Couchbase Server (Part 1) Building an Express-GraphQL API (Part 2) Create Apollo GraphQL Client in React (Part 3) Final [&hellip;]<\/p>","protected":false},"author":53002,"featured_media":10873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1822,1812,2201],"tags":[1254,1669,2210,2454],"ppma_author":[8922],"class_list":["post-8219","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-node-js","category-n1ql-query","category-tools-sdks","tag-express","tag-express-framework","tag-graphql","tag-react"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fullstack React and GraphQL : Express Server - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Build an API server using GraphQL with Express in this three part series on building a fullstack React and GraphQL application.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-express-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fullstack React and GraphQL : Express Server\" \/>\n<meta property=\"og:description\" content=\"Build an API server using GraphQL with Express in this three part series on building a fullstack React and GraphQL application.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-express-2\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-29T00:03:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:10:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Eric Bishard\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@httpJunkie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Eric Bishard\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/\"},\"author\":{\"name\":\"Eric Bishard\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/67d3a4b597e42370ccd34b715a6b1f4c\"},\"headline\":\"Fullstack React and GraphQL : Express Server\",\"datePublished\":\"2020-02-29T00:03:38+00:00\",\"dateModified\":\"2025-06-14T04:10:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/\"},\"wordCount\":1284,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg\",\"keywords\":[\"express\",\"express framework\",\"graphql\",\"React\"],\"articleSection\":[\"Couchbase Server\",\"Node.js\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/\",\"name\":\"Fullstack React and GraphQL : Express Server - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg\",\"datePublished\":\"2020-02-29T00:03:38+00:00\",\"dateModified\":\"2025-06-14T04:10:25+00:00\",\"description\":\"Build an API server using GraphQL with Express in this three part series on building a fullstack React and GraphQL application.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg\",\"width\":1200,\"height\":628,\"caption\":\"RAGE With Couchbase Express-GraphQL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fullstack React and GraphQL : Express Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/67d3a4b597e42370ccd34b715a6b1f4c\",\"name\":\"Eric Bishard\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/b7d1d2580c41d35a21654fb1abe65d23\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g\",\"caption\":\"Eric Bishard\"},\"description\":\"International speaker, blogging and advocating for the JavaScript, React, GraphQL and NoSQL community working as a Senior Developer Advocate for Couchbase.\",\"sameAs\":[\"https:\/\/www.reactstateofmind.com\",\"https:\/\/www.linkedin.com\/in\/eric-b\/\",\"https:\/\/x.com\/httpJunkie\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/eric-bishard\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Fullstack React and GraphQL : Express Server - The Couchbase Blog","description":"Construye un servidor API usando GraphQL con Express en esta serie de tres partes sobre la construcci\u00f3n de una aplicaci\u00f3n fullstack React y GraphQL.","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:\/\/www.couchbase.com\/blog\/es\/fullstack-react-express-2\/","og_locale":"es_MX","og_type":"article","og_title":"Fullstack React and GraphQL : Express Server","og_description":"Build an API server using GraphQL with Express in this three part series on building a fullstack React and GraphQL application.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/fullstack-react-express-2\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-02-29T00:03:38+00:00","article_modified_time":"2025-06-14T04:10:25+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg","type":"image\/jpeg"}],"author":"Eric Bishard","twitter_card":"summary_large_image","twitter_creator":"@httpJunkie","twitter_misc":{"Written by":"Eric Bishard","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/"},"author":{"name":"Eric Bishard","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/67d3a4b597e42370ccd34b715a6b1f4c"},"headline":"Fullstack React and GraphQL : Express Server","datePublished":"2020-02-29T00:03:38+00:00","dateModified":"2025-06-14T04:10:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/"},"wordCount":1284,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg","keywords":["express","express framework","graphql","React"],"articleSection":["Couchbase Server","Node.js","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/","url":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/","name":"Fullstack React and GraphQL : Express Server - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg","datePublished":"2020-02-29T00:03:38+00:00","dateModified":"2025-06-14T04:10:25+00:00","description":"Construye un servidor API usando GraphQL con Express en esta serie de tres partes sobre la construcci\u00f3n de una aplicaci\u00f3n fullstack React y GraphQL.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/express-graphql.jpg","width":1200,"height":628,"caption":"RAGE With Couchbase Express-GraphQL"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-express-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Fullstack React and GraphQL : Express Server"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/67d3a4b597e42370ccd34b715a6b1f4c","name":"Eric Bishard","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/b7d1d2580c41d35a21654fb1abe65d23","url":"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g","caption":"Eric Bishard"},"description":"Conferenciante internacional, blogger y defensor de la comunidad JavaScript, React, GraphQL y NoSQL trabajando como Senior Developer Advocate para Couchbase.","sameAs":["https:\/\/www.reactstateofmind.com","https:\/\/www.linkedin.com\/in\/eric-b\/","https:\/\/x.com\/httpJunkie"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/eric-bishard\/"}]}},"authors":[{"term_id":8922,"user_id":53002,"is_guest":0,"slug":"eric-bishard","display_name":"Eric Bishard","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g","author_category":"","last_name":"Bishard","first_name":"Eric","job_title":"","user_url":"https:\/\/www.reactstateofmind.com","description":"Conferenciante internacional, blogger y defensor de la comunidad JavaScript, React, GraphQL y NoSQL trabajando como Senior Developer Advocate para Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/8219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/53002"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=8219"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/8219\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/10873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=8219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=8219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=8219"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=8219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}