El repo del profe!!
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
Bienvenida y presentación del curso
Qué es Node y cómo instalarlo
¿Qué son y cómo se usan las peticiones HTTP?
Métodos, cabeceras y estados
Cuerpo y query de la petición
Crear un servidor HTTP en Javascript, y comenzar a escuchar y responder peticiones desde un cliente .
Crear un servidor HTTP desde NodeJS
¿Cómo pueden venir las peticiones?
Recibir información desde el cliente: Body y Query
Información contextual: Leer las cabeceras
Tipos de respuesta: Vacía, plana, con datos y estructurada
Respuestas coherentes
Servir archivos estáticos
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
Conceptualmente: Rutas, controladores y bases de datos
Rutas y capa de red: Responsabilidades y límites
Controladores: Definiendo la lógica de negocio
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
Tipos de Bases de Datos: Relacionales y No Relacionales
Crear y Configurar tu Base de Datos con MongoDB
MongoDB: Almacenar y leer datos
MongoDB: Actualizar datos
MongoDB: Consultar datos
MongoDB: Eliminar Datos
Gestionar conexiones a la base de datos desde la API
Uso de entidades para crear aplicaciones escalables
Escalando la arquitectura: Múltiples entidades
Relacionando nuestras entidades
Cómo recibir ficheros desde NodeJS
Guardar el fichero en el servidor
Conocer el protocolo de websockets, e implementar comunicación cliente/servidor con SocketIO.
WebSockets: Qué son, por qué son interesantes y cómo usarlos
Manejo de Websockets con NodeJS
Conectar la API al servidor de WebSockets
Revisión de lo aprendido, y próximos pasos
Revisión y próximos pasos
Tips para escalar nuestro proyecto
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Carlos Hernández
Aportes 34
Preguntas 12
El repo del profe!!
APORTE EXTRA
Cuando hacemos la petición de eliminar por primera vez un mensaje no hay problema, pero cuando lo hacemos una segunda vez a pesar de que el mensaje ya no existe en al DB nos sigue apareciendo una respuesta SUCCESS y no una respuesta de ERROR.
Para ello hice el siguiente código:
async function existDB(id) {
const exist = await Model.exists({
_id:id
});
return exist;
}
Esto devuelve un TRUE o FALSE, lo cual es la respuesta si el mensaje existe en la DB.
El return despues del reject o del resolve no es necesario 😄
También podemos utilizar:
Model.findByIdAndDelete(id);
hay un detalle en el código y es que si intentas eliminar un dato que no existe el funcionamiento hace parecer que se eliminó, en el caso de que se intente modificar un dato que no existe el programa se cae y la solución es un tanto simple, lo are solo para la función de eliminar pero para modificar es prácticamente lo mismo, lo primero es en el archivo store.js crear esta función:
const ifExist = async (id) => {
return await Model.exists({
_id: id
});
}
lo único que hace es verificar mediante id si el dato existe, y devuelve true o false, luego en la función removeMessage se tiene que verificar primero si el dato existe:
const removeMessage = async (id) => {
const siExiste = await ifExist(id);
if(!siExiste){
return siExiste;
}
return await Model.deleteOne({
_id: id
});
}
la función no cambio mucho, solo devolverá un false al controller en caso de que el id no exista en la BD. Como estaba el código de la función deleteMessage en controller.js aun devolviendo el false o un error con new Error() fa función deleteMessage no detecta si algo salió mal por lo que también hay que modificarla un poco:
const deleteMessage = (id) => {
return new Promise(async (resolve,reject) => {
if(!id){
reject('ID invalido');
}
await store.removeMessage(id)
.then((resultado) => {
if(resultado){
resolve();
}else{
reject('[Controller] El dato no existe en Store');
}
})
.catch(err => reject(err));
});
}
con respecto al código de la clase solo agregue al then el parámetro resultado y el if para devolver resolve o reject segun sea el caso, en consola nos dirá que el dato no existe en el store y al usuario solo le mostrará el error que ya tenia, para el caso del patch es un fallo mas complejo por que si se intenta modificar un dato que no existe el servidor se muere, pero aquí la solución:
const updateMessage = (id, message) =>{
return new Promise(async (resolve, reject)=>{
if(!id || !message){
reject('[Controller] Invalid data');
return false;
}
await store.updateText(id,message)
.then(resultado =>{
if(resultado){
resolve(resultado);
}else{
reject('[Controller] No se encontro el dato para actualizar');
}
});
});
}
solo modifiquen la función updateText en store.js para que valide si existe el id
Me encanta como el profesor termina cada clase, parece casi que hasta planeado. Te deja como con una incertidumbre, con unas ganas muy fuertes de seguir, diciendo implícitamente: “Ven conmigo, que apenas se está poniendo bueno 😎💚”
Para los que le den el error de then of undefined:
async function removeMessage(id) {
return await Model.deleteOne({
_id: id,
});
}
Solo es agregar Asyn/Await
En este curso aprendes mas de MongoDb que en el mismo curso de MongoDB jsjsjs
En un módulo ya hicimos todo un CRUD con Node y Mongo 💚
C - Create (POST)
R - Read (GET)
U - Update (PATCH)
D - Delete (DELETE)
Ya para profundizar más en Mongo definitivamente tomar su curso: https://platzi.com/cursos/mongodb/
Hola Devs:
-Aca mi solucion usando TypeScript:
El Network del componente Message:
El Controller del componente Message:
El Store del componente Message:
-Aca esta el commit exacto de esta clase: Click Aqui
Recuerda, #NuncaParesDeAprender 💚
Este curso, me volo la cabeza, aunque ojala hubiera alguna conexión con un fronted para saber como conectarlo y poder bien el funcionamiento 😕
Como se puede eliminar más de un registro?
Genial, muy emocionado.
Excelente, de verdad que éste profe explica muy bien.
No me queda muy claro la razón por la que en los controllers
se crea un new Promise
y dentro de este se resuelve o se rechazan las promesas del store, las funciones del store son async
y el valor retornado ya es una promesa, se envuelve una promesa dentro de otra promesa y creo que esto no es necesario se puede trabajar directamente con la promesa retornada por las funciones del store
a menos que el valor retornado por estas funciones no sea una promesa, en ese caso creo que esta perfecto que el valor se envuelva en una promesa.
Tengo un error interno. Reviso el codigo y lo reviso y no veo nada diferente al de la explicacion.
El código versión ES6+
Ruta: componente/message/network.js
router.delete('/:id',async (req,res)=>{
const { id } = req.params;
try {
await deleteMessage(id);
response.success(req,res,`Usuario ${id} elminado`,200);
} catch (e) {
response.error(req,res,'Error interno',500,e);
}
})
Ruta: componente/message/controller.js
function deleteMessage(id) {
return new Promise(async (resolve,reject)=>{
if(!id){
reject('Id invalido');
}
try {
await store.remove(id);
resolve();
} catch (e) {
reject(e);
}
})
}
Ruta: componente/message/store.js
async function removeMessage(id) {
Model.deleteOne({
_id:id
})
return await Model.findByIdAndDelete(id);
}
Tengo el siguiente error
[response error]TypeError: store.remove(...).then(...).cath is not a function
pero si me elimina el registro
Ya inspeccione el código completo y todo esta bien como en el vídeo
Si quieres retornar en tu response el mensaje que fu eliminado correctamente puedes usar el query de mongoose :_ findOneAndDelete()_
Avanzando!
Buen dia companeros, alguien sabe a que se debe este error:
db] connection successful
application listening on port 3000
5e9a5b32e2cc2bf62a30d693
[Response Error from response.js]: TypeError: Cannot read property 'then' of undefined
Muy buenas las clases!!
Cuando hago el metodo DELETE, me elimina el mensaje pero luego me lanza este error en consola, alguien sabe porque.?
[response error] Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Hay algún valor que retorne el **deleteOne **para validar que el documento realmente se removió?
Si indicó un ID que no existe me retorna un mensaje que fué removido.
Cuando se envia la peticion DELETE sin el ID en la url, aparece un error generado, al parecer, antes de nuestra validación en el controller.
Lo mismo pasa al no insertar ningun ID en el PATCH de la clase anterior.
La validacion de params no insertados no funciona en este caso.
¿Cual sería la solución?
Hay algún valor que retorne el deleteOne para validar que el documento realmente se removió?
Si indicó un ID que no existe me retorna un mensaje que fué removido.
Bueno en este vídeo encuentro una incongruencia, el teacher en el controller, en la función deleteMessage llama a remove() y en el store la función se llama removeMessage y sin embargo en la prueba le funciona, esta raro. Que paso alli???,
Esto está muy genial 😄
Excelente avance. Node lo usare en los siguientes proyectos!!
Excelente curso, hay repositorio?, tenia un pequeño error en store.js y solo lo pude solucionar hasta Carlos hizo un repaso de este archivo.
Busquemos en los comentarios, ahí está el repo del profe
Hace unas cosas muy raras:
Muy interesante, me encanta 😃
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?