-
Notifications
You must be signed in to change notification settings - Fork 32
[React] Integración Front Back
-
Instale Express generator con el comando
npm install express-generator -
Ejecute el comando
express app-back. Esto creará una nueva carpeta que contiene la estructura de un nuevo proyecto en express. -
Ingrese a la carpeta
app-backy ejecutenpm installpara instalar las dependencias necesarias. -
Instale nodemon con el comando
npm install nodemon -
Abra el archivo packcage.json y modifique el atributo
scriptsde la siguiente forma:
"scripts": {
"start": "nodemon ./bin/www"
},-
Con
nodemonel servidor se actualizará de forma automática cada vez que haya un cambio en los archivos del proyecto. -
Abra al archivo
bin/wwwy modifique la línea 15 para que el servidor escuche peticiones en el puerto 3001
var port = normalizePort(process.env.PORT || '3001');- Ejecute
npm start. Esto iniciará un servidor web para el back. Todo está correcto si al ingresar a http://localhost:3001 aparece una página con el mensaje "Express - Welcome to Express".
-
Estando dentro de la carpeta
app-backejectute el comandonpx create-react-app front. Esto crea una nueva carpeta en la que se va a desarrollar el proyecto del front. -
Borre todo el contenido de la carpeta
front/src. -
Cree dentro de
front/srcuna nueva carpeta denominadacomponents. -
Cree un nuevo archivo en
front/src/componentsdenominadoJob.jse incluya el siguiente código:
import React from 'react';
export default class Job extends React.Component {
render() {
return (
<div>
This is a job offer.
</div>
);
}
}- Cree un nuevo archivo en
front/srcdenominadoindex.jse incluya el siguiente código:
import React from "react";
import ReactDOM from "react-dom";
import Job from "./components/Job";
ReactDOM.render(<Job/>, document.getElementById("root"));-
Ingrese a la carpeta front
cd fronty ejecute el comandonpm start. Esto iniciará un nuevo servidor web que escucha peticiones en el puerto 3000. Se deberá abrir una nueva ventana del browser con la urlhttp://localhost:3000/que mostrará el mensaje "This is a job offer". -
Hasta el momento se tiene un servidor que se está ejecutando en el puerto 3001 y un cliente se está ejecutando en el puerto 3000
-
En la carpeta
frontejecute el comandonpm run build. Esto compilará el proyectofronty creará una nueva carpeta denominadabuild. -
Vaya al directorio raiz, abra el archivo
app.jsy modifique la línea 20 porapp.use(express.static(path.join(__dirname, 'front/build')));. Con esta modificación, todas las páginas que están en este directorio serán servidas al cliente como páginas estáticas. -
Si ahora ingresa en un navegador a la url
http://localhost:3001, podrá ver la página "estática" constuida en React. -
Finalmente, ingrese a la carpeta
front, modifique el archivopackage.jsone incluya esta nueva línea:"proxy": "http://localhost:3001",. Esto permitirá que todas las peticiones que se hagan en el cliente y que tengan la forma "/ruta", serán resueltas en el servidor que corre en el puerto 3001.
- Cada oferta de trabajo deberá indicar el nombre de la oferta, el nombre de la compañía, el salario ofertado y la ciudad de la oferta. Para ello se debe crear un objeto
stateenJob.js, con los siguientes atributos:
state = {
"name": "Asesor comercial de hipermercado",
"company": "Schneider Electric",
"salary": "$4.5 a $5.5 millones",
"city": "Bogotá, Colombia"
}- Incluya un método
renderOfferpara que se encargue de formatear los valores de cada uno de los atributos del objetostate.
renderOffer(){
return (
<div>
<h2>{this.state.name}</h2>
<h3>{this.state.company}</h3>
<h4>{this.state.salary}</h4>
<h5>{this.state.city}</h5>
</div>
);
}- Modifique el método
renderpara hacer el llamado al métodorenderOffer
render() {
return (
<div>
{this.renderOffer()}
</div>
);
}Dentro de la carpeta front ejecute nuevamente npm run build, y en el navegador vaya a http://locahost:3001.
De ahora en adelante, cada vez que haga un cambio en el front, debe ejecutar npm run build.
- Cree en la carpeta
front/src/componentsun archivo denominadoJobs.js, con el siguiente código:
import React from 'react';
import Job from "./Job";
export default class JobsList extends React.Component {
state = {
"offers": [
{
"name": "Asesor comercial de hipermercado",
"company": "Schneider Electric",
"salary": "$4.5 a $5.5 millones",
"city": "Bogotá, Colombia"
},
{
"name": "Desarrollador de software",
"company": "Google Inc.",
"salary": "$20 a 25 millones",
"city": "Palo Alto, CA, USA"
},
]
};
render() {
return (
<div>
{this.state.offers.map( (e,i) => <Job key={i}/>)}
</div>
);
}
}- Modifique el archivo
front/src/index.jsasí:
import React from "react";
import ReactDOM from "react-dom";
import Jobs from "./components/Jobs";
ReactDOM.render(<Jobs/>, document.getElementById("root"));- En este momento, se deberá estar mostrando en el front dos ofertas. Sin embargo ambas tienen la misma información. Lo ideal es que la información de las ofertas detalladas en el objeto
statedel archivoJobs.jssea la que se muestre en el front. Para ello, modifique el métodorenderenJobs.jsasí:
render() {
return (
<div>
{this.state.offers.map( (e,i) => <Job key={i} offer={e}/>)}
</div>
);
}-
De este modo, al componente
Jobse le está definiendo una propiedad denominadaoffer, que tiene como valor un objeto en el arrayoffersdestate. -
Modifique el objeto state en el archivo
Job.jsy el métodorenderOffer, así:
state = {
"offer": this.props.offer
};
//
renderOffer() {
return (
<div>
<h2>{this.state.offer.name}</h2>
<h3>{this.state.offer.company}</h3>
<h4>{this.state.offer.salary}</h4>
<h5>{this.state.offer.city}</h5>
</div>
);
}- En este caso, los valores para cada uno de los atributos del objeto
state, se traen de la propiedadoffer(this.props.offer).
-
El objetivo es modificar el archivo
Jobs.js, para traer la lista de ofertas desde una colección en una base de datos MongoDB. -
Para esto cree la conexión con la base de datos, agregando en el back un archivo denominado
db/Mongolib.jscon el siguiente contenido:
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const url = process.env.mongourl;
const dbName = 'job';
const client = new MongoClient(url, { useUnifiedTopology: true });
const getDatabase = (callback) => {
client.connect(function (err) {
assert.equal(null, err);
console.log("Connected successfully to server");
const db = client.db(dbName);
callback(db, client);
});
}
const findDocuments = function (db, callback) {
const collection = db.collection('offers');
collection.find({}).toArray(function (err, docs) {
assert.equal(err, null);
callback(docs);
});
}
exports.getDatabase = getDatabase;
exports.findDocuments = findDocuments;-
Agrege la libería
mongodbal back ejecutando el comandonpm install mongodb. -
Modifique el back con el fin de tener una ruta de la forma
/offersque se encargue de retornar al cliente un JSON con el listado de ofertas. Inicie creeando un nuevo archivoroutes/offers.js, con el siguiente contenido:
var express = require('express');
var router = express.Router();
const Mongolib = require("../db/Mongolib");
/* GET home page. */
router.get('/', function (req, res, next) {
Mongolib.getDatabase(db => {
Mongolib.findDocuments(db, docs => {
res.send(docs);
})
})
});
module.exports = router;Luego, modifique el archivo app.js e incluya estas dos líneas:
var offersRouter = require("./routes/offers");
//
app.use('/offers', offersRouter);- Ahora vaya al front y modifique el archivo
Jobs.jsasí:
import React from 'react';
import Job from "./Job";
export default class Jobs extends React.Component {
componentDidMount() {
const url = "/offers";
fetch(url)
.then(res => {
return res.json();
}).then(offers => {
this.setState({ offers })
})
}
state = {
"offers": []
};
render() {
return (
<div>
{this.state.offers.map((e, i) => <Job key={i} offer={e} />)}
</div>
);
}
}ISIS-3710 Programación con Tecnologías Web
Universidad de los Andes, Colombia