Tutorial - Aprende a crear una REST API con Nodejs & MongoDB - Learn how to create a REST API with Nodejs & MongoDB

Programación Web
  
Nodejs
  
Express Js
  
Api Rest
    01 Febrero, 2021   Regresar el blog
Compartir:

En el día de hoy vamos a aprender a crear una rest api con Nodejs usando código moderno ES6 (Babeljs) para ser consumida por otra aplicación (Reactjs, Vuejs, Angular, Svelte, etc...) nuestra rest api se centrara en la carga, actualización, eliminación y consultas de videojuegos usando como motor de base de datos MongoBD. Today we are going to learn how to create a rest api with Nodejs using modern ES6 code (Babeljs) to be consumed by another application (Reactjs, Vuejs, Angular, Svelte , etc ...) our rest api will focus on loading, updating, deleting and video game queries using MongoBD as a database engine.

Para empezar con nuestro ejemplo creamos una carpeta en nuestro escritorio de nombre /node-api-videogames y la abrimos con nuestro editor de código favorito en mi caso visual studio code, una vez abierto nuestro proyecto procedemos a abrir la terminal que tiene integrada el editor apretando las teclas (control + shift + P) y instalaremos los siguientes módulos necesarios para nuestro ejercicio:

To start with our example we create a folder on our desktop called / node-api-videogames and we open it with our favorite code editor in my case visual studio code, once our project is open we proceed to open the terminal that has the editor integrated pressing the keys (control + shift + P) and we will install the following modules necessary for our exercise:
npm install express morgan cors mongoose helmet dotenv 

npm install @babel/core @babel/cli @babel/node @babel/preset-env nodemon -D

Crearemos un archivo llamado .babelrc con el siguiente contenido

We will create a file called .babelrc with the following content
{
	"presets":[
		"@babel/env"
		]
	}
}

Modificamos el package.json con el siguiente contenido

We modify the package.json with the following content
"scripts":{
		"build":"babel src --out-dir build",
		"dev": "nodemon src/index.js --exec babel-node",
		"start": "node build/index.js"
}
Procedemos a crear la estructura del proyecto ( carpetas para tener todo nuestro codigo estructurado de manera ordenada ) We proceed to create the project structure (folders to have all our code structured in an orderly way)

Creamos nuestra carpeta src/ que contendrá las demás carpetas y nuestro código

We create our src / folder that will contain the other folders and our code
models/
controllers/
routes/
---Archivos---
index.js
app.js
config.js
database.js

Vamos a empezar con nuestro archivo de configuración del servidor app.js donde importaremos express , morgan y crearemos nuestra primera ruta de inicio que contendrá la información del proyecto, y nuestras rutas de nuestra api de videojuegos

We are going to start with our server configuration file app.js where we will import express, morgan and create our first start path that will contain the information of the project, and our paths of our videogame api
App.js
import express from ´express´
import morgan from ´morgan´
import pkg from ´../package.json´
import videogamesRoute from ´./routes/videogames.routes´
//initialization
const app = express()
app.set(´pkg´,pkg)
app.set(´PORT´, process.env.PORT || 3000)
//Middlewares
app.use(morgan(´dev´))
app.get(´/´, (req,res) => {
    res.json({
        "name":app.get(´pkg´).name,
        "author":app.get(´pkg´).author,
        "description":app.get(´pkg´).description,
        "version":app.get(´pkg´).version
    })
})
app.use(´/videogames/´, videogamesRoute)
export default app

Ahora dentro de la carpeta routes/ crearemos un archivo de nombre videogames.routes.js que contendra las rutas de nuestra api con el siguiente contenido:

Ahora dentro de la carpeta routes/ crearemos un archivo de nombre videogames.routes.js que contendrá las rutas de nuestra api con el siguiente contenido:
routes/videogames.routes.js
import {Router} from ´express´
import  * as videogamesCtrl  from ´../controllers/videogames.controller´
const router = Router()
router.get(´/´,videogamesCtrl.getVideogames)
router.post(´/´,videogamesCtrl.createVideogame)
router.get(´/:id´,videogamesCtrl.getVideogameById)
router.delete(´/:id´,videogamesCtrl.deleteVideogameById)
router.put(´/:id´,videogamesCtrl.updateVideogameById)
export default router

Ahora dentro de la carpeta controllers/ crearemos un archivo de nombre videogames.controller.js que contendrá las funciones de nuestra api con el siguiente contenido:

Now inside the controllers / folder we will create a file called videogames.controller.js that will contain the functions of our api with the following content:
controllers/videogames.controller.js
export const createVideogame = (req,res) => {
    res.json(´Create videogame´)
}
export const getVideogames = (req,res) => {
    res.json(´Get videogames´)
}
export const getVideogameById = (req,res) => {
    res.json(´Get videogame´)
}
export const updateVideogameById = (req,res) => {
    res.json(´Update videogame´)
}
export const deleteVideogameById = (req,res) => {
    res.json(´Delete videogame´)
}

Procedemos a conectarnos con la base de datos (mongodb) para ello modificamos el archivo database.js con el siguiente contenido: We proceed to connect with the database (mongodb) for this we modify the database.js file with the following content:
database.js
import mongoose from ´mongoose´
mongoose.connect("mongodb://localhost/apidbvideogames", {
    useNewUrlParser: true,
    useUnifiedTopology:true
})
    .then(db => console.log(´DB is conected´))
    .catch(error => console.log(error))

Ahora procedemos a modificar nuestro index.js que es el que se encarga de iniciar el proyecto con el siguiente contenido: Now we proceed to modify our index.js which is the one in charge of starting the project with the following content
index.js
import app from ´./app´
import ´./database´
async function main(){
    await app.listen(app.get(´PORT´))
    console.log(´Server on port´, app.get(´PORT´))
}
main()

Ahora procedemos a definir los datos que vamos a guardar dentro de la BD a esto se le conoce como modelo de datos crearemos dentro de models el archivo Videogames.js con el siguiente contenido: Now we proceed to define the data that we are going to save inside the DB, this is known as data model we will create within models the file Videogames.js with the following content :
models/Videogames.js
import {Schema, model} from ´mongoose´
const videogamesSchema =  new Schema({
    name: String,
    category: String,
    year:Number,
    imgUrl: String
},{
    timestamps:true,
    versionKey :false
})
export default model(´Videogames´,videogamesSchema)

Es momento de usar el modelo de datos para guardar, editar, consultar y eliminar registros, volvemos al controlador para editar con el siguiente código:

It is time to use the data model to save, edit, consult and delete records, we return to the controller to edit with the following code:
controllers/videogames.controller.js
import Videogames from ´../models/Videogames´
export const createVideogame = async (req,res) => {
    const {name, category, year, imgUrl} = req.body
    const newVideogame =  new Videogames({name,category,year,imgUrl})
    const videogameSaved = await newVideogame.save()
    res.status(201).json(videogameSaved)
}
export const getVideogames = (req,res) => {
    res.json(´Get videogames´)
}
export const getVideogameById = (req,res) => {
    res.json(´Get videogame´)
}
export const updateVideogameById = (req,res) => {
    res.json(´Update videogame´)
}
export const deleteVideogameById = (req,res) => {
    res.json(´Delete videogame´)
}

Con eso ya tenemos nuestra primera ruta de crear videojuego lista, para probar la ruta yo uso una extensión de visual studio code llamado REST client que uso para probar las rutas, existen otras alternativas como Postman o insonmia entre otras.

With that we have our first route of creating a video game ready, to test the route I use a visual studio code extension called REST client that I use to test the routes, there are other alternatives such as Postman or insonmia among others.

Como ya podemos guardar un videojuego lo más lógico seria mostrar todos los videojuegos de nuestra bd con el siguiente código

As we can already save a video game, the most logical thing would be to show all the video games in our database with the following code
controllers/videogames.controller.js
import Videogames from ´../models/Videogames´
export const createVideogame = async (req,res) => {
    const {name, category, year, imgUrl} = req.body
    const newVideogame =  new Videogames({name,category,year,imgUrl})
    const videogameSaved = await newVideogame.save()
    res.status(201).json(videogameSaved)
}
export const getVideogames = async(req,res) => {
   const listOfVideogames = await Videogames.find()
   res.json(listOfVideogames)
}
export const getVideogameById = (req,res) => {
    res.json(´Get videogame´)
}
export const updateVideogameById = (req,res) => {
    res.json(´Update videogame´)
}
export const deleteVideogameById = (req,res) => {
    res.json(´Delete videogame´)
}


Ahora procederemos a obtener un videojuego por su id con el siguiente código:

Now we will proceed to obtain a video game by its id with the following code:
controllers/videogames.controller.js
import Videogames from ´../models/Videogames´
export const createVideogame = async (req,res) => {
    const {name, category, year, imgUrl} = req.body
    const newVideogame =  new Videogames({name,category,year,imgUrl})
    const videogameSaved = await newVideogame.save()
    res.status(201).json(videogameSaved)
}
export const getVideogames = async(req,res) => {
   const listOfVideogames = await Videogames.find()
   res.json(listOfVideogames)
}
export const getVideogameById = async(req,res) => {
    const itemFound = await Videogames.findById(req.params.id)
    res.status(200).json(itemFound)
}
export const updateVideogameById = (req,res) => {
    res.json(´Update videogame´)
}
export const deleteVideogameById = (req,res) => {
    res.json(´Delete videogame´)
}


Es el turno de actualizar un videojuego:

It is the turn to update a video game:
controllers/videogames.controller.js
import Videogames from ´../models/Videogames´
export const createVideogame = async (req,res) => {
    const {name, category, year, imgUrl} = req.body
    const newVideogame =  new Videogames({name,category,year,imgUrl})
    const videogameSaved = await newVideogame.save()
    res.status(201).json(videogameSaved)
}
export const getVideogames = async(req,res) => {
   const listOfVideogames = await Videogames.find()
   res.json(listOfVideogames)
}
export const getVideogameById = async(req,res) => {
    const itemFound = await Videogames.findById(req.params.id)
    res.status(200).json(itemFound)
}
export const updateVideogameById = async(req,res) => {
    const updatedVideogame = await Videogames.findByIdAndUpdate(req.params.id,req.body,{new:true})
    res.status(200).json(updatedVideogame)
}
export const deleteVideogameById = (req,res) => {
    res.json(´Delete videogame´)
}


Y por último el eliminar videojuego:

And finally the delete video game:
controllers/videogames.controller.js
import Videogames from ´../models/Videogames´
export const createVideogame = async (req,res) => {
    const {name, category, year, imgUrl} = req.body
    const newVideogame =  new Videogames({name,category,year,imgUrl})
    const videogameSaved = await newVideogame.save()
    res.status(201).json(videogameSaved)
}
export const getVideogames = async(req,res) => {
   const listOfVideogames = await Videogames.find()
   res.json(listOfVideogames)
}
export const getVideogameById = async(req,res) => {
    const itemFound = await Videogames.findById(req.params.id)
    res.status(200).json(itemFound)
}
export const updateVideogameById = async(req,res) => {
    const updatedVideogame = await Videogames.findByIdAndUpdate(req.params.id,req.body,{new:true})
    res.status(200).json(updatedVideogame)
}
export const deleteVideogameById = async(req,res) => {
    await Videogames.findByIdAndDelete(req.params.id)
    res.status(204).json()
}







Y con esa amigos llegamos al final del tutorial, espero que lo hayan disfrutado y hasta la próxima! / And with that friend we come to the end of the tutorial, I hope you enjoyed it and until next time!


Visite mi sitio web oficial / Visit my official website

tupaginaonline.net

516 vistas
Compartir:


Autor
Jose Fuentes

- Web Developer -

 


0 COMENTARIO(S)
Contesta
Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *
Comentario *
Nombre *
Correo electrónico *
Sitio web

Articulos Relacionados
Articulos recientes

Desarrollos en venta

$ usd dólar 600