Conocer y comprender c贸mo se realizan las conexiones hacia los servidores a trav茅s de internet y sus implicaciones en el desarrollo de servidores

1

Bienvenida y presentaci贸n del curso

2

Qu茅 es Node y c贸mo instalarlo

3

驴Qu茅 son y c贸mo se usan las peticiones HTTP?

4

M茅todos, cabeceras y estados

5

Cuerpo y query de la petici贸n

Crear un servidor HTTP en Javascript, y comenzar a escuchar y responder peticiones desde un cliente .

6

Crear un servidor HTTP desde NodeJS

7

驴C贸mo pueden venir las peticiones?

8

Recibir informaci贸n desde el cliente: Body y Query

9

Informaci贸n contextual: Leer las cabeceras

10

Tipos de respuesta: Vac铆a, plana, con datos y estructurada

11

Respuestas coherentes

12

Servir archivos est谩ticos

13

Errores: C贸mo presentarlos e implicaciones en la seguridad

Comprender y desarrollar la arquitectura b谩sica de un backend en NodeJS, y comunicarse entre m贸dulos

14

Conceptualmente: Rutas, controladores y bases de datos

15

Rutas y capa de red: Responsabilidades y l铆mites

16

Controladores: Definiendo la l贸gica de negocio

17

Almacenando la informaci贸n en una base de datos

Utilizar una base de datos para definir, modelar, almacenar y recuperar la informaci贸n de nuestra aplicaci贸n

18

Tipos de Bases de Datos: Relacionales y No Relacionales

19

Crear y Configurar tu Base de Datos con MongoDB

20

MongoDB: Almacenar y leer datos

21

MongoDB: Actualizar datos

22

MongoDB: Consultar datos

23

MongoDB: Eliminar Datos

24

Gestionar conexiones a la base de datos desde la API

Uso de entidades para crear aplicaciones escalables

25

Escalando la arquitectura: M煤ltiples entidades

26

Relacionando nuestras entidades

27

C贸mo recibir ficheros desde NodeJS

28

Guardar el fichero en el servidor

Conocer el protocolo de websockets, e implementar comunicaci贸n cliente/servidor con SocketIO.

29

WebSockets: Qu茅 son, por qu茅 son interesantes y c贸mo usarlos

30

Manejo de Websockets con NodeJS

31

Conectar la API al servidor de WebSockets

Revisi贸n de lo aprendido, y pr贸ximos pasos

32

Revisi贸n y pr贸ximos pasos

33

Tips para escalar nuestro proyecto

A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Recibir informaci贸n desde el cliente: Body y Query

8/33
Recursos

En esta clase instalaremos nodemon para que cada vez que haya un cambio en nuestro proyecto se reinicie el servidor.

Aportes 75

Preguntas 26

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

A mi me estuvo pasando el JSON como undefined. En caso de que a alguien le pase es posible que tengan el app.use(router) adelante del app.use(bodyparser.json())

Seg煤n lei el enrutador debe de ir al final de todo

Actualmente ya bodyparser viene en express, so
podr铆amos utilizarlo de la siguiente manera鈥

const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended : false}));

Si alguien usa postman, es la opci贸n de BODY > raw y de ahi seleccionan JSON(application/json)

En mi caso para levantar el servidor con nodemon tuve que utilizar npx:

npx nodemon server.js

Me d铆 cuenta que se debe usar bodyParser.json() antes que el router:

Si se hace viceversa

el body queda como undifined.

驴Por que sucede esto?

Podemos ver el c贸digo en cada uno de los lenguajes de como env铆a insomnia la petici贸n:

Hola a todos: Tengo el siguente error cuando paso el body por url

[Object: null prototype] { text: 'hola' }

Pero cuando paso el valor del extend en true si aparece normal 驴Alguna idea de porque en false no me funciona?

Paso mi c贸digo:

const express = require('express');
const bodyParser = require('body-parser');
const router = express.Router();

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(router);

router.get('/message', function(req,res){

    res.send('This message is geted');
})

router.delete('/message', function(req,res){


    console.log(req.body)
    res.send('This message is deleted');


})

app.listen(3000)

Como dato curioso:
No es necesario instalar BODYPARSER para poder recibir mensajes tipo JSON o hacer uso de URLENCODED ya que body-parser viene instalado en express.
Link de explicaci贸n aqu铆

Si alguno en Windows 10 no puede ejecutar scritps debe usar :
Set-ExecutionPolicy -Scope CurrentUser Unrestricted

asi te da permisos para usar el comando:

nodemon server

Una manera mas condensada de definir los diferentes m茅todos HTTP para una misma ruta puede expresarse de la siguiente manera:

router.route("/")
.all((request, response, next) => {
   //Puede funcionar como middleware
    console.log("Accedo a la ruta /")
    next()
})
.get((request, response) => {
    response.send("Hola desde get")
})
.post((request, response) => {
    response.send("Hola desde post")
})
.delete((request, response) => {
    response.send("Hola desde delete")
})

Express ya incluye bodyParser en su m贸dulo asi que ya no es necesario instalarlo. recuerden que express.Router funciona como un middleware que tiene las rutas y por eso es necesario que el codigo vaya antes de este middleware.

const express = require('express');
const router = express.Router();

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: false }))
app.use(router);

router.get('/', (req,res) => {
    res.send('Lista de mensajes (hola desde get)');
});

router.post('/', (req,res) => {
    console.log(req.body);
    console.log(req.query);
    res.send(`Mensaje a帽adido (${req.body.text} desde post)`);
});

router.put('/', (req,res) => {
    res.send('Mensaje editado (Hola desde put)');
});

router.patch('/', (req,res) => {
    res.send('Mensaje editado (Hola desde patch)');
});

router.delete('/', (req,res) => {
    res.send('Mensaje borrado (Hola desde delete)');
});

app.listen(3000, () => {
    console.log('Telegram listening on port 3000')
});```

No usen sudo si estan en windows

npm install -g nodemon

Por que tenemos que hacer parse del body?

Para aquellos que est茅n viendo este curso en el 2021, en esta forma forma de pasear la entrada ha cambiado:

usen:

app.use(express.json());
app.use(router);

Configuraci贸n de Nodemon en Computador Windows sin permiso de administrador
En un blog (https://www.blai.blog/2019/05/habilitar-ejecucion-de-archivos-ps1-en.html), Blai se帽ala una forma sencilla se ejecutar.
Se ha modificado la ruta del servidor local porque se se帽ala que son direcciones peligrosas

1. Instala Nodemon normalmente
En una terminal de usuario ejecutar
npm install -g nodemon
Si pruebas ejecutar nodemon se emite un mensaje que no se puede cargar archivo .ps1 porque la ejecucion de scripts esta deshabilitada en el sistema.
2. Verifica permisos de ejecuci贸n de scripts
Ejecutar
Get-ExecutionPolicy -list
Se recibe la lista, donde se observa que no se han definido los permisos de ejecuci贸n
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined

3. Cambia los permisos del usuario actual
Ejecuta
Set-ExecutionPolicy -Scope CurrentUser unrestricted
y luego compruebalo ejecutando
Get-ExecutionPolicy -list
La lista muestra ahora que se ha cambiado el permiso de ejecuci贸n para el usuario actual
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Unrestricted
LocalMachine Undefined

4. Verifica Nodemon
Ejecuta nodemon normalmente
nodemon servername
Se verifica su funcionamiento correcto
[nodemon] 2.0.6
[nodemon] to restart at any time, enter 'rs'
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting 'node servername.js'
la aplicacion esta escuchando en host local,puerto 3000
cambio en un archivo
[nodemon] restarting due to changes...
[nodemon] starting 'node servername.js'
la aplicacion esta escuchando en host local, puerto 3000
`
Espero que les sriva de ayuda.
Saludos

ahora me aparece el

bodyparser.json()

como deprecated, en su lugar pueden usar

express.json()

Despues de la version 4.16.0 de express ya no es necesario utilizar body-parser, este ya viene integrado en express.

Debemos usarlo de la siguiente manera:

app.use(express.urlencoded({extended: false})); app.use(express.json());

bodyParser se encuentra deprecado actualmente, ya viene directamente en express

Ya no es necesario instalar el m贸dulo body-parser, si estas usando una version de Express 4.16 o mayor.
Sin instalarla puedes usar el middleware que viene ahora incorporado en Express:
app.use(express.json());

驴Es necesario instalar el m贸dulo body-parser?

En vez de usar bodyParser, puedes usar una funcionalidad de express que sirve para lo mismo:

app.use(express.json());

este middleware ponlo encima del middleware de las rutas para que primero haga el parseo antes de llegar a las rutas.

As矛:

app.use(express.json());
app.use(router);

ya no es necesario body-parser actualmente (sale como deprecated)

app.use(express.json()); //alternativa a body-parser antes: bodyParser.json()
app.use(express.urlencoded({extended: false}));

tengo hecho todo igual hasta el min. 6 aprox. pero en la consola me sale undefined

Aclarando dudas clase a clase, GRACIAS!!!

<h2> Recibir informaci贸n desde el cliente: Body y Query </h2>


Configurar servidor

// Convierte la informacion del body en un objeto json
app.use(express.json()); 

// Extrae los datos de la url
app.use(express.urlencoded({ extended: true }));

<h4>Recibir informacion del body desde el cliente</h4>
localhost:3000/

La informacion se envia a traves del body

router.get('/message', function (req, res) {
    console.log(req.body);
    res.send('Extraer mensajes del body');
})

Resultado

{ edad: '22' }

<h4>Recibir informacion usando querys</h4>

Endpoint

localhost:3000/message?nombre=Angel&Apellido=Roque Ayala

router.get('/message', function (req, res) {
    console.log(req.query);
    res.send('Extraer informacion de un query');
})

Resultado en consola

{ nombre: 'Angel', Apellido: 'Roque Ayala' }

<h4>Recibir datos usando parametros</h4>

Endpoint

localhost:3000/message/789
router.get('/message/:id', function (req, res) {
    console.log(req.params);
    res.send('Extraer parametros');
})

resultado en consola

{ id: '789' }

Muy buen curso, me encanta鈥 馃槂
Pr谩cticas:

Siempre que muestro el contenido de la cabecera en el m茅todo POST del modo console.log(req.body) me muestra 鈥渦ndefined鈥. No he podido lograr ver la cabecera del metodo POST.

Archivo Routes 馃槂

const {Router} = require('express');
const {home,message} = require('./controllers')
const routes = Router();

routes.get('/home',home)
routes.post('/message', message)

module.exports = routes

Archivo Controller 馃槂

home = (req, res)=>{
    res.send('ok').status(200)
}

message = (req, res)=>{
    const {Hola} = req.query
    const { text } = req.body
    console.log(text);
    res.send(`${text}, ${Hola}`).status(200)
    
}

module.exports = 
{
    home,
    message
}

Archivo Server 馃槂

const express = require('express');
const routes = require('./routes')
const app = express();
app.set('port', 3000)
app.use(express.urlencoded({extended: false}))
app.use(express.json())
app.use(routes)

app.listen(app.get('port'), ()=>{
    console.log(`port in ${app.get('port')}`);
})

Hola, tambien se puede a帽adir el mensaje de esta forma

res.send(`Mensaje ${req.body.text} eliminado correctamente`);

Tengo entendido que el body-parser ya viene incluido en express, no es necesario instalarlo.
Se puede usar como:

app.use(express.json());
app.use(express.urlencoded({ extended: false }))

Y siempre debe ponerse antes de usar el middleware de rutas porque los middlewares se usan en orden y si no est谩 parseado el body antes de llegar a las rutas aparecer谩 como indefinido.

Tambien se puede ocupar los template string para que imprima el mensaje de manera un poco m谩s bonita :

router.delete('/mensajes', function (req, res) {
    console.log(req.query); // Esto permite que la url sea aceptado como body
    console.log(req.body);  // Imprime el valor de body
    res.send(`Mensaje ${req.body.text} Eliminado`);
});

Ocupando ${} y comillas tipo ``

Body-parser: es una extensi贸n que nos permite trabajar con el body de la petici贸n de forma sencilla.

a d铆a de hoy express ya cuenta con el tema del body y el url encoded en su librer铆a 馃榿

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

Puedes hace peticiones desde VSC con la extension REST Client:
Sobre las direcciones URL aparecera un opcion para lanzar la peticion.
Lo escribes en un documento de extensi贸n .http:

GET http://localhost:3000/message

###

POST http://localhost:3000/message?name=Max&lastname=D铆az
Content-Type: application/json

{
    "text":"Hola, Max"
}

Desde postman envio por urlencoded y recibo la siguiente informaci贸n:

la aplicaci贸n esta escuchando en http://localhost:3000
[Object: null prototype] { text: 'hola' }```

驴Qu茅 es el [Object: null prototype] ?

Solo para quienes vengan del futuro , Express integra boyd-parser como middleware, por lo que no es necesario instalar body-parser,

por lo que podremos hacer :

	app.use(express.json());
	app.use(express.urlencoded({extended: true } ));

Cree un miniChat con ayuda de las querys: 馃槃

const mensajes = ['Jhon: Hola, andrea!','Andrea: 驴como est谩s?']

router.post('/',(req,res)=>{
    let new_mesage = req.query.message
    mensajes.push(new_mesage)
    res.send(mensajes)
    console.log(req.body.message)
})

excelente explicaci贸n, gracias!!

const express =  require('express');
const bodyParser = require('body-parser');
const router = express.Router();

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(router);

router.get("/", function(req, res){
    res.send("peticion de get");
  });

router.post("/", function(req, res){
    res.send("peticion de post");
  });

router.patch("/",function(req, res){
    res.send("peticion de patch");
  });

router.delete("/",function(req, res){
    res.send("peticion de delete");
  });

app.listen(3000);
console.log(" la aplication esta escuchando en el port http://localhost::3000");

驴Alguien est谩 trabajando con Postman en lugar de con Insomnia? Postman es el que conoc铆a de antes y lo estoy probando pero parece ser que me falta algo a la hora de mandar la info como JSON, si que me salta el console y/o el res.send del router.post, pero tanto req.query como req.body me aparecen vac铆as, no consigo que se vean los valores que le paso (y los headers est谩n como application/json).

驴Alg煤n consejo?

Para los que est谩n viendo en 2022 (espero actualicen este curso) ya no se necesita bodyparse, solo usen el json normal. Ejemplo:

app.use(express.json());

Carlos eres un crack!! un abrazo desde Barcelona, Catalunya, Espa帽a!

No me gusto que Insomnia sea pago asi que al final termine utilizando Postman. Funciona para casi lo mismo.

Cuando tengas problemas al cargar las instalaciones de los paquetes

ejecuta en PowerShell
ejecuta->Set-ExecutionPolicy -Scope LocalMachine unrestricted

ejecuta S o O para todo

si no queda despues de la correccion
ejecuta ->Set-ExecutionPolicy -Scope CurrentUser

abrindo el canal con el valor 1


espero les sirva dea yuda

Muy buena clase !!

<h3>M茅todos</h3> <h5>Get</h5>

Es utilizado cunado se requiere alg煤n recurso del servidor por ejemplo un CSS, JS etc, en les caso de una API鈥檚 es utilizado para listar informaci贸n. los estatus son

status significado
200 todo sali贸 bien
<h5>Post</h5>

Es utilizado cuando se quiere crear agregar informaci贸n al servidor por ejemplo el envio de un formulario los estados son

status significado
201 recurso creado
<h5>Put</h5>

Es utilizado cuando se quiere actualizar informaci贸n del servidor

status significado
202 Cambio aceptado
204 No se realizo acci贸n
<h5>Patch</h5>

Es utilizado cuando se quiere actualizar una sola parte de la informaci贸n del servidor.

status significado
202 Cambio aceptado
204 No se realiz贸 acci贸n
<h5>Delete</h5>

Es utilizado cuando se quiere eliminar informaci贸n del servidor.

status significado
202 Cambio aceptado
204 No se realiz贸 acci贸n

A mi me dio erro, diciendo que el archivo no esta firmado digitalmente, si alguien mas le pasa les dejo estos 2 comandos par resolverlo

get-ExecutionPolicy -list
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

A los que les genera un error de versi贸n antigua o deprecated, les recomiendo ver el ejemplo de: https://github.com/expressjs/body-parser

npm WARN deprecated [email protected]: One of your dependencies needs to upgrade to fsevents v2: 1) Proper nodejs v10+ support 2) No more fetching binaries from AWS, smal
ler package size
/Users/tom/.npm-global/bin/nodemon -> /Users/tom/.npm-global/lib/node_modules/nodemon/bin/nodemon.js

Genial super claro ! !

nodemon se usa en el curso de fundamentos de nodejs

vamos bien

Estupenda clase! la recomiendo

Muy bueno, entonces:

// Instalar
sudo npm install -g nodemon

// Ejecutar
 nodemon archivo.js

Por el momento鈥xcelente!!

router.post('/message', function (req, res){
    console.log(req.query);
    console.log(req.body);
    res.send(`Mensaje ${req.body.text} a帽adido correctamente`)
})

Hermosa esta clase definitivamente 馃槃

yo no pod铆a instalar nodemon pero con este comando ya pude

npm install -g nodemon

Excelente Clase

al ejectuar nodeman server , me dice que la ejecucion de scripts esta desabilitada alguien sabe como puedo solucionar eso ?

Genial

const express = require('express');
const router = express.Router();
const bodyParser = require('body-parser')

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(router);

router.get('/message', function(req, res){
    res.send('Lista de mensajes');
});

router.delete('/message', function(req, res){
    console.log(req.body);
    console.log(req.query);
    res.send('Mensaje ' + req.body.text + ' eliminado correctamente');
});

app.listen(3000);
console.log('La aplicaci贸n esta escuchando en http://localhost:3000')```

馃槈

router.delete('/message', (req, res) => {
    console.log(req.query);
    console.log(req.body);
    res.send(`Mensaje ${req.body.text} a帽adido correctamente`);
});

age=15 ;v

cool

para los que les paso lo mismo que a mi los servidores de node se paran con
control + c

<h1>Recibir informaci贸n desde el cliente: Body y Query</h1> <h3>C贸mo trabajamos con el body?</h3>
  • Instalamos el body parser, que es un modulo de express que nos permite trabajar con el body de la petici贸n de manera facil

    $ npm i body-parser

  • Agregamos el modulo de body parser a nuestro servidor

const express = require("express");
const bodyParser = require("body-parser");
const router = express.Router();

var app = express();
app.use(bodyParser.json());//siempre hay que indicar tipo de informaci贸n que recibiremos
app.use(router);

El body lo encontraremos siempre en la request, para esto realizamos un:

console.log(req.body);

para asegurarnos que estamos recibiendo el body correctamente.

<h3>Recibiendo datos desde el query</h3>

Estos datos son los que recibimos mediante el url que se est谩 solicitando al servidor por ejemplo

http://localhost:3000?orderBy=id&age=15

En el cual estamos recibiendo que queremos la orden por id y la edad de 15.

Para mostrar estoy en consola lo realizamos tambi茅n a trav茅s de

console.log(req.query);
<h3>Imprimiendo datos del body en la p谩gina</h3>
router.post("/", function (req, res) {
  console.log(req.query);
  console.log(req.body);
  res.send(`Mensaje ${req.body.text} a帽adido`);
});

Me genera este error al instalar nodemon

PS C:\SpdSolutionApi> nodemon server

nodemon : No se puede cargar el archivo C:\Users\XXXXX\AppData\Roaming\npm\nodemon.ps1 porque la ejecuci贸n de scripts est谩 deshabilitada en este sistema.

Para obtener m谩s informaci贸n, consulta el tema about_Execution_Policies en https:/go.microsoft.com/fwlink/?LinkID=135170.
En l铆nea: 1 Car谩cter: 1

  • nodemon server
  •   + CategoryInfo          : SecurityError: (:) [], PSSecurityException
      + FullyQualifiedErrorId : UnauthorizedAccess
    

PS C:\SpdSolutionApi> ``

express.urlencoded([options])
This middleware is available in Express v4.16.0 onwards.

This is a built-in middleware function in Express. It parses incoming requests with urlencoded payloads and is based on body-parser.

Yo recib铆 1 objeto y esto:

[Object: null prototype] { text: 'hola' }

Podeis tambien destructurar el req y asignarle el valor que querais: Ejemplo:

app.post('/post', function(req, res){
    const {body:{ Hola: theBody }} = req;
    const {query: {age: theQuery}} = req;

    res.json({
        "METHOD": "POST",
        "use": "It creates a new Object in the server",
        "example":`This is the body: ${theBody} and this is the query: ${theQuery} Post status 馃憤`
    })
})

Tarde pa, pero se agradece un toque 馃槑

si usas la terminal de ubuntu en windows, para poder utilizar el comando nodemon deber谩s instalar nodemon de esta forma tambi帽en

npm i nodemon -g

Tambi茅n es posible mandar la respuesta en JSON sin el bodyparser. Usando los m茅todos de respuesta, que muestra la documentaci贸n de express.

router.get('/', function(req, res) {
    res.json('Hola desde get');
});
<h3>res.json ([cuerpo])</h3>

Este m茅todo env铆a una respuesta (con el tipo de contenido correcto) que es el par谩metro convertido a una cadena JSON usando聽JSON.stringify ()聽.

El par谩metro puede ser de cualquier tipo JSON, incluido objeto, matriz, cadena, booleano, n煤mero o nulo, y tambi茅n puede usarlo para convertir otros valores a JSON.

res.json(null)
res.json({ user: 'tobi' })
res.status(500).json({ error: 'message' })

referencia: https://expressjs.com/en/4x/api.html#res.json

Error en la terminal de vsc:

Soluci贸n:
1 - Si no lo tengo instalado, instalo node.js del siguiente link https://nodejs.org/.(Le doy siguiente y siguiente hasta que finalice) 2 - Abro Visual studio code y abro la terminal, apretando control + 帽 o en el menu superior poniendo ver / terminal 3 - Luego, instalamos SASS con el siguiente comando npm install -g sass 4 - En windows apretamos inicio y buscamos windows powershell, le damos click derecho y lo abrimos como administrador 5 - En la consola escribimos Set-ExecutionPolicy Unrestricted, le damos enter y cuando nos deje escribir de nuevo nos va a pedir que confirmemos, le ponemos una S y le damos enter. De esta manera habilitamos la ejecuci贸n de los scripts 6- Una vez terminado todos los pasos anteriores ya podemos cerrar windows powerShell y en visual studio code nos va a dejar ejecutar todos los comandos del curso