Node Js - Tutorial
Node Js - Tutorial
Node Js - Tutorial
Node.JS, es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la capa del
servidor basado en el lenguaje de programación ECMAScript, asíncrono, con I/O de datos en una
arquitectura orientada a eventos y basado en el motor V8 de Google.
Si deseas aprender a instalar Node.JS te invito a mi siguiente post
Articulo completo
API REST, es cualquier interfaz entre sistemas que use HTTP para obtener datos o generar
operaciones sobre esos datos en todos los formatos posibles, como XML y JSON. Las operaciones
más importantes relacionadas con los datos en cualquier sistema REST y la especificación HTTP son
cuatro: POST (crear), GET (leer y consultar), PUT (editar) y DELETE (eliminar).
JWT, JSON Web Token (abreviado JWT) es un estándar abierto basado en JSON propuesto por IETF
(RFC 7519) para la creación de tokens de acceso que permiten la propagación de identidad y
privilegios. Articulo Completo
Bcrypt, es una función de hashing de passwords diseñado por Niels Provos y David Maxieres, basado
en el cifrado de Blowfish. Se usa por defecto en sistemas OpenBSD y algunas distribuciones Linux y
SUSE. Lleva incorporado un valor llamado salt, que es un fragmento aleatorio que se usará para
generar el hash asociado a la password, y se guardará junto con ella en la base de datos. Así se evita
que dos passwords iguales generen el mismo hash y los problemas que ello conlleva, por ejemplo,
ataque por fuerza bruta a todas las passwords del sistema a la vez.
Articulo Completo
Express.JS, Es un framework para Node.js que sirve para ayudarnos a crear aplicaciones web en
menos tiempo ya que nos proporciona funcionalidades como el enrutamiento, opciones para
gestionar sesiones y cookies, entre otras cosas.
Articulo Completo
Flujo de Trabajo
Para poder consumir los recursos protegidos, el usuario debe enviar el token JWT en el encabezado.
Vamos a iniciar creando una carpeta donde almacenaremos nuestro proyecto y luego de eso
ejecutamos el comando npm init para la creaccion de nuestra API.
Con el comando npm init se crea un archivo llamado package.json. En este archivo, queda reflejada
la configuración del proyecto de NodeJs tales como:
Autor.
Version.
Dependencias.
Scripts.
Repositorio Git.
"name": "olimpo",
"version": "1.0.0",
"main": "index.js",
"scripts": {
},
"author": "Gerh",
"license": "MIT"
╭─[/home/gerh/Escritorio/Prometheus/MyCodes/Blog/API-REST-
NODEJS]─[root@Raeghal]─[0]─[1112]
╰─[:)] # npm install bcrypt body-parser express jsonwebtoken mongoose morgan --save
╭─[/home/gerh/Escritorio/Prometheus/MyCodes/Blog/API-REST-
NODEJS]─[root@Raeghal]─[0]─[1112]
bcrypt, Esta dependencia nos ayudara a hashear de manera simple las contraseñas de los usuarios.
De esta manera, garantizamos la confidencialidad de estos datos sensibles que estaran almacenados
en nuestra base de datos.
body-parser, Con esta dependencia vamos a extraer toda la parte del cuerpo de un flujo de solicitud
entrante y lo expone en req.body; como algo con lo que es más fácil interactuar.
Nodemon, Esta dependencia observará los archivos en el directorio en el que se inició nodemon, y
si cualquier archivo cambia, nodemon reiniciará automáticamente su aplicación de node.JS.
Después de instalar las dependencias, su archivo package.json tendrá la lista de todas las
dependencias instaladas:
"dependencies": {
"bcrypt": "^3.0.6",
"body-parser": "^1.19.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.5.14",
"morgan": "^1.9.1"
Ahora que hemos finalizado la instalacion de estas dependencias podemos continuar creando las
carpetas que contendran toda la logica del API REST.
Para este desarrollo utilizaremos el patron Modelo Vista Controlador (MVC), El cual es un estilo de
arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica
de control en tres componentes distintos.
Creamos un archivo con el nombre “server.js” dentro del directorio raiz y su contenido sera el
siguiente:
app.use(logger('dev'));
app.use(bodyParser.urlencoded({extended: false}));
});
Para validar todo lo que hemos hecho, vamos a inicializar nuestro servidor con el siguiente
comando:
╭─[/home/gerh/Escritorio/Prometheus/MyCodes/Blog/API-REST-
NODEJS]─[root@Raeghal]─[0]─[1137]
[nodemon] 1.19.1
Los modelos dentro de NodeJS son representaciones de una entidad de la base de datos y más
concretamente van a representar a un único registro o documento de nuestra base de de datos.
Para este tutorial, vamos a tener una colección en la base de datos llamada Usuarios, dentro de ella
se guardarán documentos de tipo Usuario.
Por lo tanto debemos crear un modelo de Usuario con todos sus campos y cuando queramos crear
una usuario haremos una instancia de ese modelo.
Vamos a crear un archivo con el nombre “users.js”, en la ruta: /API-REST-
NODEJS/app/api/models/users.js
// Definimos el factor de costo, el cual controla cuánto tiempo se necesita para calcular un solo hash
de BCrypt. Cuanto mayor sea el factor de costo, más rondas de hash se realizan. Cuanto más tiempo
sea necesario, más difícil será romper el hash con fuerza bruta.
nombre: {
type: String,
trim: true,
required: true,
},
email: {
type: String,
trim: true,
required: true
},
password: {
type: String,
trim: true,
required: true
});
// Antes de almacenar la contraseña en la base de datos la encriptamos con Bcrypt, esto es posible
gracias al middleware de mongoose
UserSchema.pre('save', function(next){
next();
});
Creacion de controladores
Continuemos creando un controlador para el modelo recien creado, debe estar almacenado en la
ruta /API-REST-NODEJS/app/api/controllers/users.js:
// Codificamos las operaciones que se podran realizar con relacion a los usuarios
module.exports = {
if (err)
next(err);
else
});
},
if (err) {
next(err);
} else {
if(bcrypt.compareSync(req.body.password, userInfo.password)) {
}else{
});
},
Nuestro controlador de usuario incluira el modelo de usuario y los modulos jsonwebtoken y bcrypt.
Tambien hemos definido dos metodos:
Metodo Create
Con este metodo podremos crear nuevos usuarios.
Metodo Authenticate
En este metodo, hemos creado una funcion que realiza una busqueda en la base de datos por medio
del correo electronico, con ello logramos validar la existencia de un usuario.
Luego comparamos la contraseña simple que se envia a través del formulario de inicio de sesión
contra la contraseña de la base de datos; cabe aclarar que si contraseña coincide se generara el
token JWT con una validez de 1 hora.
Creacion de Rutas
Luego de codificar lo anterior, vamos a proceder con la creacion de rutas para los métodos de
control de los usuarios anteriores.
Este archivo debe estar almacenado en /API-REST-NODEJS/routes/users.js
// Especificamos nuestras rutas teniendo en cuenta los metodos creados en nuestro controlador, y
especificando que seran rutas que usaran el metodo POST
router.post('/register', userController.create);
router.post('/authenticate', userController.authenticate);
module.exports = router;
Nuestra API tendra la funcionalidad de leer, crear, actualizar y eliminar registros de videojuegos.
Creacion del controlador
Creamos un archivo en la siguiente ruta:
/API-REST-NODEJS/app/api/controllers/videogames.js
El contenido debe ser el siguiente:
module.exports = {
console.log(req.body);
if (err) {
next(err);
} else {
});
},
if (err){
next(err);
} else{
});
},
if(err)
next(err);
else {
});
},
if(err)
next(err);
else {
});
},
if (err)
next(err);
else
});
},
}
//Definimos el esquema
name: {
type: String,
trim: true,
required: true,
},
released_on: {
type: Date,
trim: true,
required: true
});
// Especificamos nuestras rutas teniendo en cuenta los metodos creados en nuestro controlador
router.get('/', videogameController.getAll);
router.post('/', videogameController.create);
router.get('/:videogameId', videogameController.getById);
router.put('/:videogameId', videogameController.updateById);
router.delete('/:videogameId', videogameController.deleteById);
module.exports = router;
app.use(logger('dev'));
app.use(bodyParser.urlencoded({extended: false}));
});
// Rutas publicas
app.use('/users', users);
// Rutas privadas que solo pueden ser consumidas con un token generado
res.sendStatus(204);
});
// Para acceder a las rutas de peliculas hemos definido middleware para validar al usuario.
if (err) {
}else{
req.body.userId = decoded.id;
next();
});
err.status = 404;
next(err);
});
console.log(err);
if(err.status === 404)
else
});
app.listen(3000, function(){
});
mongoose.connect(mongoDB);
mongoose.Promise = global.Promise;
module.exports = mongoose;
Registro de usuarios.
POST http://localhost:3000/users/register
Validando el servicio de registro de usuarios.
GERARDO ELIASIB