Estas notas explican como crear una aplicación web que utiliza Express para el back-end y React.js para el front-end.
La aplicación a construir permitirá desplegar refranes aleatorios al presionar un botón:
1. Configuración inicial
-
Crear una aplicación de Express con los siguientes comandos desde la terminal:
express --view=ejs refranescd refranesnpm install -
Instalar el compilador de babel para poder utilizar JSX en nuestro proyecto. En la terminal dentro del directorio
refranesteclear:npm install babel-cli@6 babel-preset-react-app@3 --saveCrear el directorio
react_srcpara guardar los archivos fuentes de React.mkdir react_srcAbrir en el editor el archivo
package.jsony agregar la propiedad"babel"al objeto asociado a"scripts"con el siguiente valor:"npx babel --watch react_src --out-dir public/javascripts --presets react-app/prod". El archivopackage.jsonse debe ver así ahora:{ "name": "refranes", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www", "babel": "npx babel --watch react_src --out-dir public/javascripts --presets react-app/prod" }, "dependencies": { "babel-cli": "^6.26.0", "babel-preset-react-app": "^3.1.2", "cookie-parser": "~1.4.4", "debug": "~2.6.9", "ejs": "~2.6.1", "express": "~4.16.1", "http-errors": "~1.6.3", "morgan": "~1.9.1" } }Ahora, para poder correr el compilador de babel es necesario teclear en la terminal el siguiente comando (en el directorio
refranes) y dejarlo corriendo mientras estemos escribiendo código de React:npm run babelCualquier archivo que con extensión
.jsxo.js(JSX o ECMAScript 6 o superior) que sea creado y/o modificado en el directorioreact_srcautomaticamente será traducido a ECMAScript 5 y el archivo resultante se colocará en el directoriopublic/javascripts.
2. Back-end: API web de refranes
-
Crear un archivo JSON llamado
refranes.jsony guardarlo en el directorioroutes. Copiar el siguiente contenido a dicho archivo:Archivo:routes/refranes.json[ "¡A darle que es mole de olla!", "Agua que no has de beber, déjala correr.", "Al nopal sólo se le arriman cuando tiene tunas.", "Botellita de jerez, todo lo que me digas será al revés.", "Sale más caro el caldo que las albóndigas.", "Dando y dando, pajarito volando.", "El que con lobos anda, a aullar se enseña.", "El que es perico, donde quiera es verde.", "Ni tanto que queme al santo, ni tanto que no lo alumbre.", "Dime de qué presumes y te diré de qué careces.", "Árbol que nace torcido, jamás su tronco endereza.", "El hombre propone, Dios dispone, llega el diablo y todo descompone.", "Crea fama y échate a dormir.", "Más sabe el diablo por viejo, que por diablo.", "Al buen entendedor, pocas palabras." ] -
Añadir al final del archivo
routes/index.jslas siguientes líneas de código:Archivo:routes/index.jsconst refranes = require('./refranes.json'); router.get('/refran', (req, res) => { const refran = refranes[(Math.random() * refranes.length) | 0]; res.json({ refran }); }); -
Para probar el API web, ejecutar el servidor. Desde la terminal teclear:
npm startSin terminar la ejecución del servidor, abrir otra terminal y correr el siguiente comando:
curl -i localhost:8080/refranLa salida debe ser algo así (puede ser distinta ya que es aleatoria):
HTTP/1.1 200 OK X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 54 ETag: W/"36-pw1bYjKBmzzBjqmaW1aSRd+seoQ" Date: Fri, 27 Mar 2020 04:22:02 GMT Connection: keep-alive {"refran":"Agua que no has de beber, déjala correr."}
3. Front-end: La interfaz de usuario
-
Crear un archivo llamado
refranes.htmly colocarlo en el directoriopublic. El contenido de este archivo debe ser el siguiente:Archivo:public/refranes.html<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Refranes</title> <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css"> <script src="https://unpkg.com/react@16/umd/react.development.js"> </script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"> </script> </head> <body> <div id="root"></div> <script src="/javascripts/refranes.js"></script> </body> </html> -
Crear un archivo de React llamado
refranes.jsxen el directorioreact_src. El contenido de este archivo debe ser:/* global React, ReactDOM, fetch */ const Cabeza = () => ( <div className="w3-bar w3-teal"> <div className="w3-container"> <h1> Refranes aleatorios </h1> </div> </div> ); const Pie = () => ( <footer className="w3-container w3-center w3-small"> <span className="w3-mobile"> © 2020 por Pepper Pots (A01166611) </span> </footer> ); const Texto = props => ( <div className="w3-panel w3-sand w3-card-4"> <p> <em>{props.mensaje}</em> </p> </div> ); class Aplicacion extends React.Component { constructor(props) { super(props); this.state = { mensaje: 'Presiona el botón para obtener un refrán al azar.' }; this.cliquea = this.cliquea.bind(this); } cliquea() { fetch("/refran") // llamada de AJAX .then(res => res.json()) .then( result => { this.setState({ mensaje: result.refran }); }, error => { this.setState({ mensaje: error.message }); } ); } render() { const { mensaje } = this.state; return ( <div> <Cabeza /> <div className="w3-container"> <Texto mensaje={mensaje} /> <p> <button className="w3-button w3-black w3-round-xlarge" onClick={this.cliquea}> Genera refrán </button> </p> </div> <hr /> <Pie /> </div> ); } } ReactDOM.render( <Aplicacion />, document.getElementById('root') ); -
Es importante que tanto el servidor de node (
npm start) como el compilador de babel (npm run babel) estén corriendo en sus propias terminales.Del menú de Cloud9 seleccionar Preview / Preview Running Application. Al URL de la página que se abre se le debe añadir
/refranes.htmlal final.Si todo se realizó correctamente, la aplicación web debe verse en el navegador. Cada vez que se presione el botón debe aparecer un refrán al azar.