No se pero este hombre le pone una emoción a esto que no puedo explicar, lo mejor es que esa misma emoción siento yo node es demasiado.
Conocer los conceptos básicos de NodeJS
Instalación de Node.js
Node: orígenes y filosofía
EventLoop: asíncrona por diseño
Monohilo: implicaciones en diseño y seguridad
Configurar las variables de entorno en Node.js
Herramientas para ser más felices: Nodemon y PM2
Cómo manejar la asincronía
Callbacks
Callback Hell: refactorizar o sufrir
Promesas
Async/await
Entender los módulos del core
Globals
File system
Console
Errores (try / catch)
Procesos hijo
Módulos nativos en C++
HTTP
OS
Process
Utilizar los módulos y paquetes externos
Gestión de paquetes: NPM y package.json
Construyendo módulos: Require e Import
Módulos útiles
Datos almacenados vs en memoria
Buffers
Streams
Conocer trucos que no quieren que sepas
Benchmarking (console time y timeEnd)
Debugger
Error First Callbacks
Manejar herramientas con Node
Scraping
Automatización de procesos
Aplicaciones de escritorio
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Carlos Hernández
Aportes 113
Preguntas 9
No se pero este hombre le pone una emoción a esto que no puedo explicar, lo mejor es que esa misma emoción siento yo node es demasiado.
La función de cifrado de bcrypt nos permite construir una plataforma de seguridad utilizando contraseñas encriptadas con Salt.
const bcrypt = require("bcrypt");
const password = "NuncaParesDeAprender2020";
bcrypt.hash(password, 5, function(err, hash){
console.log(hash)
});
// La consola nos entregaria una contraseña distinta en cada oportunidad.
// Para evaluar si una contraseña concuerda con un hash
bcrypt.compare(password, hash, function(error, result){
console.log(result)
console.log(error)
})
// Nos va a responder **true** *(en el result)* o **false** *(en el error)* dependiendo si la contraseña puede generar el hash
Moment. js es una librería que nos permite solventar estos problemas e implementa un sistema de manejo de fechas mucho más cómodo.
const moment = require('moment')
const ahora = moment();
// Para formatear una fecha
ahora.format('MM/DD/YYYY HH:MM A'); // 04/11/2020 20:10 PM
// Para validad una fecha
moment('2020-04-11').isValid(); // Nos dara **true** o **false** dependiendo de si la fecha es valida o no
// Para encontrar cuanto tiempo ha pasado hasta hoy
moment('2018-04-11').fromNow(); // Hace 2 años
// Para agregar o eliminar años, días o meses
moment('2020-04-11').add(1, 'years'); // 2021-04-11
moment('2020-04-11').subtract(1, 'years'); // 2019-04-11
Sharp puede convertir imágenes grandes en imágenes JPEG, PNG más pequeñas y compatibles con la web de diferentes dimensiones.
const sharp = require('sharp')
// La siguiente reducira una imagen de 120x120 o cualquier tamaño a 80x80 y lo guardara en una imagen mas pequeña sin eliminr la original.
sharp('imagen.png').resize(80, 80).toFile('imagen_80x80.png');
La dislexia 😂
OJO!!!
Gente NO utilicen moment, es una libreria que se creo hace mucho tiempo y sirvio en su tiempo, ahora hay mejores alternativas, la misma gente de moment te recomiendan usar otras librerias mas modernas
bcrypt y sharp necesitan Python 2.7 para funcionar
Sufriendo en PHP para conseguir una librería que me convirtiera un SVG en PNG
y acá con un npm install sharp y una línea de código ya lo tengo
sharp(‘corona.svg’).png().toFile(‘corona.png’);
console.clear();
const bcrypt = require('bcrypt');
const password = '1234Segura!';
let promise = new Promise(function (resolve, reject) {
bcrypt.hash(password, 5, function (err, hash) {
if (err != null) {
reject(err);
}
resolve(hash);
});
});
promise
.then((result) => {
passwordHash = result;
console.log(result);
saveToDatabase();
})
.catch((err) => {
console.log(err);
});
function saveToDatabase() {
console.log('password saved...');
console.log(passwordHash);
}
Wow… este a sido uno de los mejores cursos que he tomado, no solo por el profesor y como transmite esa alegria de enseñar, sino tambien por las cosas utiles que aprendes y utilizas dia a dia.
Prefiero usar promises que callbacks, son geniales 😄
bcrypt .hash(password, 2048).then((hash) => { console.log("perfecto, aqui esta el hash ", hash); }) .catch((error) => { console.log("sucedio un error"); });
asi es como podria quedar lo de bcrypt pero con promesas
const bcrypt = require('bcrypt');
const password = '1234Segura!';
let passwordHash
bcrypt.hash(password, 5)
.then(hash => {
console.log(hash)
return hash
})
.then(hash => {
return bcrypt.compare(password, hash)
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
Módulos que utilizaremos frecuentemente en nuestras aplicaciones como:
bycript : Permite encriptar un string generando un hash.
bycript.hash : Genera el hash del string, este método recibe por parámetros el string a encriptar, las veces que debe ejecutarse el script para generar un hash aleatorio y por ultimo una función que se encarga de capturar hash o el error que se presente.
bycript.compare : Permite comprar el hash con el string a encriptado y nos devuelve un true o false. bycript.compare
recibe por parámetros el string a encriptado, luego el hash y por ultimo una función que captura la información o el error que se presente.
//importamos el modulo
const bcrypt = require('bcrypt');
//declaramos el pass o palabra a encriptar
const passworld = '1234Segura';
//bcrypt.hash no permite generar un hash
bcrypt.hash(passworld, 10, function(error, hash) {
console.log(hash);
//bcrypt.compare nos devuelve un boleano si hash y contraseña son iguales
bcrypt.compare(passworld, hash, function(err, res) {
console.log(res)
});
});
moment : Logramos manipular fechas de manera eficiente.
moment.format : Podemos darle un formato adecuado a nuestra fecha.
//importamos el modulo
const moment = require('moment');
let ahora = moment();
//establecemos el formato a usar
let ahoraFormat = ahora.format('HH:mm:ss');
console.log(ahoraFormat);
sharp : Permite trabajar con imágenes
//importamos el modulo
const sharp = require('sharp');
//ruta de la imagen a modificar
sharp('fondo-carro.jpg')
//scalamos la imagen a 500 de alto
.resize(500)
//otorgamos una escala de grises
.grayscale()
//generamos el archivo modificado
.toFile('fondo-carro-small.jpg');
Usando este comando lo pude instalar en linux
npm install --save bcryptjs && npm uninstall --save bcrypt
Y en Windows con el siguiente:
npm install -g node-gyp
npm install --g --production windows-build-tools
Despues:
npm install bcrypt
Cuando utilizo express utilizo npm install bcryptjs
Justo en un momento donde había perdido cierta motivación, la energía de este profesor me ha vuelto a motivar a continuar
😮 Yo despues de esta clase awww cuanto poder
moment
.El paquete moment
se puede instalar por medio de npm de la siguiente forma:
npm i moment
Este módulo permite ampliar las opciones de trabajar con fechas en Node, un ejemplo:
const moment = require('moment')
let now = moment()
console.log(now.format('DD/MM/YYYY - HH:mm'))
// Para validad una fecha
moment('2020-04-11').isValid();
// Nos dara **true** o **false** dependiendo de si la fecha es valida o no
// Para encontrar cuanto tiempo ha pasado hasta hoy
moment('2018-04-11').fromNow(); // Hace 2 años
// Para agregar o eliminar años, días o meses
moment('2020-04-11').add(1, 'years'); // 2021-04-11
moment('2020-04-11').subtract(1, 'years'); // 2019-04-11
En este ejemplo, el módulo moment
permite obtener la hora y dar el formato que necesite. Además tiene más funciones para calcular los días entre distintas fechas, y mucho más.
sharp
Este módulo permite gestionar imágenes. La instalación es la siguiente:
npm i sharp
Permite manipular las imágenes con muchos métodos:
const sharp = require('sharp')
sharp('original.png').resize(80).toFile('resized.png')
En este caso, estamos cambiando el tamaño de la imagen original.png
a un tamaño de 80px, y se crea un archivo llamado resized.png
.
El paquete se llama bcrypt
la instalación se hace con npm de la siguiente forma:
npm i bcrypt
Este módulo permite el cifrado de las contraseñas que son guardadas en una base de datos para no almacenarlas en texto plano.
bcrypt
.Lo primero que debemos hacer es importar el módulo.
const bcrypt = require('bcrypt')
Luego, se debe tener una contraseña para poder ejecutar el método hash
que existe en el módulo bcrypt
.
const password = '1234Segura!'
bcrypt.hash(password, 5, function (err, hash) {
console.log(hash)
bcrypt.compare(password, hash, (err, res) => {
console.log(res)
})
})
En el código anterior, se utiliza el método .hash()
, el cuál tiene 3 parámetros:
password
, es la contraseña que va a ser encriptada.5
, el cuál puede ser cualquier número y hace referencia a la cantidad de veces que va a ser ejecutado el algoritmo de encriptación.function
, es una promesa que va a tener la información de la encriptación, tiene dos parámetros, el error y el hash
, que es el resultado de la encriptación.Para poder comparar si una contraseña digitada por un usuario u obtenida e algún sitio concuerda con el hash asignado, se utiliza el método compare
, el cual tiene los mismos 3 parámetros y permite recibir un boolean
que dice si el hash
concuerda con la pass
.
wow… node.js es como el python del backend con modulos para todo!!
XD
fechas (‘moment’), imágenes (‘sharp’) y password (‘bcrypt’)
Comparto el ejemplo de Bcrypt con promesas.
Cuando quieran bajar la imagen y no se les guarde en formato .webp. Pongan un signo de pregunta ‘?’ al final del enlace
https://static.platzi.com/media/public/uploads/original_219068e1-0543-480f-9f1b-e0844c5e06d2.png?
Como bien dijo el usuario programadores, para windows funciona bcryptjs: “npm i bcryptjs”, si usamos bcrypt solo no funciona.
Importante el manejo de bcrypt
const bcrypt = require('bcrypt');
const password = '1234Segura!';
//tambien funciona con promesas
bcrypt.hash(password, 5, (err, hash) => {
console.log(hash);
bcrypt.compare(password, hash, (err, res) => {
//console.log(err);
console.log(res);
})
})
El dolor de cabeza del manejo de fechas, con esta es super.
const moment = require('moment');
let ahora = moment();
console.log(ahora.toString());
console.log(ahora.format('YYYY/MMM/DD - HH:mm'));
console.log(ahora.format('YYYY/MM/DD - HH:mm'));
Definitivamente existe para cada cosa un modulo ya hecho
const sharp = require('sharp');
sharp('gotcha.png')
.resize(80,80)
.toFile('resize.png');
sharp('gotcha.png')
.grayscale()
.toFile('resize1.png');
sharp('gotcha.png')
.rotate(90)
.toFile('resize2.png');
El “ahora” sale de una la fecha:
Moment<2021-07-23T21:50:52-05:00>
Supongo que por ser versión node mas reciente.
hice una función básica usando sharp y la quiero compartir con ustedes. En principio está sencilla pero permite personalizar aun más los archivos.
const sharp = require('sharp');
function convert(route, size, name) {
sharp(route)
.resize(size)
.toFile(`${name}.png`)
console.log('El proceso se ha realizado con éxito');
}
convert('./original.png', 100, 'nueva');
¿How to use async await with bcrypt? 👍
const bcrypt = require('bcrypt');
async function hashPassword(pass) {
return await bcrypt.hash(pass, 5);
}
async function comparePassword(pass1, encrypted) {
return await bcrypt.compare(pass1, encrypted);
}
async function main() {
const password = 'pa55w0rd';
const hashedPassword = await hashPassword(password);
console.log(hashedPassword);
const validPassword = await comparePassword(password, hashedPassword);
console.log(validPassword);
}
main();
Excelente, hay que ver que estos módulos son de los más comúnes pero no son los únicos. Es genial ver la aplicabilidad de cada módulo en ejemplos concretos. Me llamaba mucho la atención NODE, ahora me gusta el doble
a qui un ejemplo de bcrypt con promesas
const bcrypt = require ('bcrypt');
const password = '1234segura!';
const saltRound = 2048;
bcrypt.hash(password, saltRound)
.then(hash => {
console.log("perfecto, aqui esta el hash ", hash);
bcrypt.compare(password,hash)
.then((result)=>{
console.log(result);
}).catch(error=>{
console.error(error);
});
}).catch(error => {
console.error(error);
});
Así podrían usar bcrypt con Async/Await, ya que la function .hash() regresa una promesa, se puede manejar con async/await.
const bcrypt = require('bcrypt');
const password = '1234Safe!';
const createHash = async (password) => {
try {
const hash = await bcrypt.hash(password, 5);
console.log(hash);
} catch(err) {
console.error(err);
}
}
createHash(password);
Estos son algunos módulos de npm mencionados junto con sus funcionalidades principales:
bcrypt:
Funciones de encriptación de contraseñas con sal.
bcrypt.hash()
: Genera un hash de una contraseña.
bcrypt.compare()
: Compara una contraseña con su hash correspondiente.
Ejemplo:
const bcrypt = require('bcrypt');
let password = '1234Segura!';
bcrypt.hash(password, 5)
.then(result => {
console.log(result);
return result;
})
.then(result => {
bcrypt.compare(password, result).then(result => console.log(result));
})
.catch(err => console.error(err));
moment:
sharp:
Biblioteca para procesamiento de imágenes.
sharp().resize()
: Redimensiona una imagen.
sharp().grayscale()
: Convierte una imagen a escala de grises.
sharp().resize().toFile()
: Redimensiona y guarda una imagen en un archivo.
Ejemplo:
const sharp = require('sharp');
sharp('jslogo.png')
.resize(80)
.grayscale()
.toFile('jslogoModified.png')
.then(info => console.log(info))
.catch(err => console.error(err));
numeral:
Biblioteca para formateo de números y valores.
numeral.value(’1,000’)
: Recibe un valor e internamente lo almacena como un int 1000
Ejemplo:
const numeral = require('numeral');
let myNumeral = numeral(1000);
let myNumeral2 = numeral('1,000');
console.log(myNumeral2.value());
Recuerda instalar estos módulos antes de utilizarlos en tu proyecto utilizando el comando npm install nombre-del-modulo
.
‘La dislexia’ xDD
Excelentes librerias, todas son maravillosas, al igual que la explicación
++Los comandos para instalar los módulos: ++
npm i bcrypt
npm i moment
npm i sharp
excelentes librerías
/* la libreria moment sirve para trabajar con fechas */
const moment = require('moment');
let ahora = moment();
/* console.log(ahora); */
/* De esta manera podemos ver la fecha usando moment con el formato que queramos */
console.log(ahora.format('YY/MM/DD'))
/* bcrypt se usa para encriptar contrasenas */
const bcrypt = require('bcrypt');
const password = '1234Segura!';
bcrypt.hash(password, 5, function(err, hash) {
console.log(hash);
bcrypt.compare(password, hash, function(err, res) {
/* console.log(err); */
console.log(res);
})
});
/* bcrypt tambien funciona con promesas no solamente con callback */
Muchas veces he visto en los comentarios de platzi comentarios tipo: “Seria bueno que llevarán o explicaran como utilizarlo en el día a día”.
.
Bueno aquí esta esa clase, con información super valiosa y explicada de una manera increíble.
no sé si actualmente moment tenga habilitado el tree shaking y hace que nuestra aplicación pese más, hay una opción que se llama date fns que es lo mismo que moment, pero si cuenta con el tree shaking😁
Usando Bcrypt con promesas :
const bcrypt = require('bcrypt')
const hashPassword = (password) => {
return new Promise ((resolve, reject) => {
bcrypt.hash(password, 5, (err, hash) => {
err ? reject(err) : resolve(hash)
})
})
}
let password = 'daniela123'
hashPassword(password).then(data => console.log(data))
Para el M1 genera error, como si el archivo no se encontrara. Según documentación aun no hay soporte 😭.
11:10 justo estaba escuchando una música de suspenso xd
La dislexia🤣
Debería de existir un curso solo de esto !!! 😃 genial la clase
wooow sharp es genial, no tenía conocimiento de ella!!
dayjs es mas liviano que moment y hacen tecnicamente los mismo
Si tienen algún problema al hacer npm i byript recomiendo que usen el paquete bycriptjs, se instala haciendo npm i bycriptjs
Puse un 90 por error y se me crasheo la maquina jajajajajajaa
NODE sin este profesor no es lo mismo, ciento que le dieron el curso perfecto al profesor que le mete mucho respeto al don de educar, gracias Carlos Hernandez
La liberia moment ya la han dejado de desarrollar, es recomendable dejar de usarla
¿Se puede hacer un modulo que importe modulos?
Aquí les dejo la versión con async await:
.
.
PD: esa sintaxis al rededor de la función asincrona es una forma de ejercutar la función al mismo tiempo que es declarada 😁💚
bcrypt - utilidades para encriptar
moment - Trabajar con fechas
sharp - tratamiento de imágenes
excelente librerias importante conocerlas.
Excelente clase para aprender lo básico de algunos módulos que nos puede servir de forma cotidiana en nuestro proyecto.
Quienes vieron el detalle con el nombre del archivo?
Me agrada bastante la forma en que explica Carlos. Excelente profe.
Muy muy interesante!
si instalo uan depedencia como sharp dentro de un init de npm este solo funciona para ese modulo o es global para otros proyectos???
require(‘sharp’): sirve para transformar imagenes
require(‘moment’): sirve para manipular agilmente fechas
++npm init -y++: permite obviar las preguntas de instalación
Necesidad frecuentes en node:
trabajar las fechas
trabajar con imagenes
trabajar contraseñas
Creo que a esta y todas las clases de este profesor les hizo falta un boton de like porque son demasiado buenas y bien explicadas, sabe alguien si tiene mas clases el?
Excelente clase!!!
// Modulos utiles
// Estos modulos son buenos para encriptar, la "hora" y sharp que nos permine modificar archivos.
// Bycript
const bcrypt = require('bcrypt');
const password = '1234Security';
bcrypt.hash(password, 5, function(err, hash) {
console.log(hash)
bcrypt.compare(password, hash, function(err, res) {
console.log(res)
})
})
// Moment
const moment = require('moment');
let ahora = moment();
// console.log(ahora.toString());
console.log(ahora.format('YYYY/MM/DD - HH:mm'));
// Sharp
const sharp = require('sharp')
sharp('original.png')
.resize(80)
.grayscale()
.toFile('resized.png')
npm i bcrypt no funciona, sale un error de que se necesita phyton para usarlo.
In love with Sharp
Excelentes librerías.
Qué MARAVILLOSA CLASE 😄 !!!
const sharp = require('sharp')
sharp('imagen1.png')
.resize(80)
.toFile('resized.png')
¡excelente clase!
Este curso es lo mejor que existe
La dislxia! genio!!!
Para los que actualmente les sale un error con sharp.js
const sharp = require('sharp')
sharp('./original_219068e1-0543-480f-9f1b-e0844c5e06d2.png')
.resize(80)
.grayscale()
.toFile('./resized.png')
Grandes herramientas!
Excelente clase!
ATENCIÓN:
El compañero @andresmotiva compartió el siguiente código:
const bcrypt = require("bcrypt");
const password = "NuncaParesDeAprender2020";
bcrypt.hash(password, 5, function(err, hash){
console.log(hash)
});
// La consola nos entregaria una contraseña distinta en cada oportunidad.
// Para evaluar si una contraseña concuerda con un hash
bcrypt.compare(password, hash, function(error, result){
console.log(result)
console.log(error)
})
// Nos va a responder **true** *(en el result)* o **false** *(en el error)* dependiendo si la contraseña puede generar el hash
Si por la razón que sea en la línea donde esté
bcrypt.compare(password, hash, ...
les dice que hash está indefinido -como me pasó a mí- y quieren ver el resultado del compare rápidamente, les recomiendo intentar colocar bcrypt.compare dentro de bcrypt.hash. Adicionalmente, revisando la documentación a día de hoy 10 de diciembre de 2022 dentro de npm, sugieren utilizar genSalt. Les dejo el código tal y como lo tengo yo:
const bcrypt = require("bcrypt");
const password = "NuncaParesDeAprender2020";
const saltRounds = 10;
//const someOtherPlaintextPassword = 'not_bacon';
//pueden usar esta constante para hacer un bcrypt.compare, como sugieren en la documentación.
var Elhash;
bcrypt.genSalt(saltRounds, function (err, salt) {
bcrypt.hash(password, salt, function (err, hash) {
if (err) {
console.error(err);
}
console.log(hash);
bcrypt.compare(password, hash, function (err, result) {
console.log(`El resultado: ${result}, el error: ${err}`);
});
});
});
Para los que no les funciona el Sharp, en caso era la ruta que no la encontraba, y mi solución fue poner su ubicación relativa:
const sharp = require('sharp');
try {
sharp('paquetes/utiles/magen.png')
.resize(80)
.grayscale()
.toFile('paquetes/utiles/resized.png', (err, info) => {
if (err) {
console.error('Error al procesar la imagen:', err);
} else {
console.log('Imagen procesada exitosamente:', info);
}
});
} catch (error) {
console.error('Error general:', error);
}
dando este resultado para verificar:
Imagen procesada exitosamente: {
format: 'png',
width: 80,
height: 80,
channels: 3,
premultiplied: false,
size: 1267
}
Mucho cuidado con las funciones síncronas que sean pesadas ya que pueden bloquear el hilo principal de nodejs y congelar el servidor. Si las funciones u operaciones son pesadas (que no son instantáneas), lo recomendable sería manejarlas de forma asíncronas.
Todos viendo “orginal” 😳
La password mas seguro que he visto !!!
bcrypt
const bcrypt = require('bcrypt')
const password = '1234segura!'
bcrypt.hash(password, 5, (err, hash) => {
console.log(hash)
bcrypt.compare(password, hash, (err, res) => {
//console.log(err)
console.log(res)
})
})
moment
const moment = require('moment');
let ahora = moment()
//console.log(ahora.toString())
console.log(ahora.format('YYYY/MM/DD - HH:mm'))
sharp
const sharp = require('sharp');
sharp('original.png')
.resize()
.grayscale()
.toFile('resized.png');
me estan re gustando estas claseeees
La mejor clase sin ninguna duda 😃
Amé el módulo sharp 😍.
Adiós photoshop para web development!
Cabe mencionar que Sharp
puede ser usado con Callbacks, Promesas o Async/Await
Muy excelentes recursos los que enseñan en esta clase
excelentes recursos, soy nuevo en node, y ahora voy viendo la utilidad de esta gran herramienta
Interesantes libraries, aunque tuvo qlgunos updates.
sharp, me encantó !
Este video es de mucha utilidad!
Como acotacion a la clase, en las ultimas versiones de node, en la carpeta node_modules, no viene ya por defecto el modulo sharp asi que se debe instalar con “npm i sharp” O “npm install sharp”, como mejor les funcione, feliz dia coders
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?