Nos creamos un primer proyecto

npm init

Rellenando los campos. Luego, instalaremos express, en nuestro proyecto api-rest, el cual es un framework, para agilizar las comunicaciones cliente-servidor.
Se nos añadirán las dependencias en package.json y nos creará la carpeta node_modules, con todas las librerias existentes. Es la manera que tiene node de optimizar el rendimiento.

npm i express -S api-rest

Ahora creamos el archivo api-rest.js

'use strict' //Forma parte de las buenas prácticas y permite hacer uso de determinadas variables útiles.
const express = require('express') //Importamos express
const app = express()
app.listen(3001, () => {
console.log('API REST corriendo en http:///localhost:3001');
})

Activamos el servidor:

node api-rest.js

-> Accedemos al servidor

Instalaremos la libreria 'body-parser', para recoger los post

npm i -S body-parser

Para evitar tener que parar el servidor, cada vez que queramos hacer un cambio, instalaremos la librería, 'nodemon'

npm i -D nodemon (D para instalarla en las devDependecies

Vemos package.json, como se han istalado, la añadimos a start para que se carge al arrancar la app

{
 "name": "api-rest",
 "version": "1.0.0",
 "description": "Proyecto de API REST con Node.js y Express",
 "main": "api-rest.js",
 "scripts": {
   "start": "nodemon api-rest.js",
   "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "Federico Lleo (https://fedelleos.es)",
 "license": "MIT",
 "dependencies": {
   "body-parser": "^1.19.0",
   "express": "^4.17.1"
 },
 "devDependencies": {
   "nodemon": "^2.0.13"
 }
}

Debemos ejecutar

npm start

Si nos da problemas, instalar

npm install -g less
npm i -g less-plugin-clean.css
npm start

npm start
> api-rest@1.0.0 start
> nodemon api-rest.js
[nodemon] 2.0.13
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json [nodemon] starting `node api-rest.js` API REST corriendo en http://fedelleos.es:3001

Añadimos una peticion get

'use strict' //Forma parte de las buenas prácticas y permite hacer uso de determinadas variables útiles.
const express = require('express') //Importamos express
const app = express()
const bodyParser = require('body-parser')
const app = express()
const port = process.env.PORT || 3001
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())

app.get('/hola/:name',(req,res) => {
res.send({message:'Hola '+req.params.name+'!'})
})

app.listen(port, () => {
console.log('API REST corriendo en http:///localhost:3001');
})

Al poner http://fedelleos.es:3001/hola/Fede

Saldrá

{"message":"Hola Fede!"}

Podemos añadir una extensión al navegador "json formatter", que nos permitirá leer el json formateado.

Para que una api, sea restfull, se dice que debe contener los métodos de GET, POST, PUT (actualizar), DELETE

Códigos de respuesta:
Los códigos 100, es información, de que la petición ha sido recibida y se está procesando
Los códigos 200, es que todo a ido bién
Los códigos 300, es que vamos a redirigir a una reedirección
Los códigos 400, ha habido un error, en el clientes
Los códigos 500, ha habido un error en el servidor

Añadiremos los comandos

app.get('/api/product', (req, res) => {
  res.send(200, {products: []})
})

app.get('/api/product/:porductId', (req, res) => {
})

app.post('/api/product', (req, res) => {
  console.log(req.body)
  res.status(200).send({messsage: 'El producto se ha recibido'})
})

app.put('/api/product/:productId', (req, res) => {

})

app.delete('/api/product/:productId', (req, res) => {

})

Para poder probar una petición tipo POST, al no ir en el navegador como las GET, utilizaremos una herramienta llamada POSTMAN

Lo descargamos en escritorio, si queremos
Pinchamos en POST, en Body, y en x-www-form-urlencoded, escribimos los parametros que vamos a enviar
name   MacBook
price   300
photo   macbook.png
category   laptop

Enviamos, y el navegador nos postrará
{
"message": "El producto se ha recibido"
}


Creamos base de datos y esquema de datos con mongoDb


Ahora debemos utilizar una libreria para conectarnos a la base de datos desde nuestra aplicacion

npm i -S mongoose
Si hay problemas
npm audit fix --force

Creamos el esquema de base de datos Product, en la base de datos shop

En models, creamos product.js, ver como exportamos el objeto Producto, para que lo recoja .js

'use strict'
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const ProductSchema = Schema({
 name: String,
  picture: String,
  price: { type: Number, default: 0 },
  category: { type: String, enum: ['computers', 'phone', 'accesories']},
  description: String })
module.exports = mongoose.model('Product', ProductSchema)

En api-rest.js, anadimos:

const Product = require('./models/product')

app.get('/api/product', (req, res) => {
  res.status(200).send( { products: [] })
})
app.post('/api/product', (req, res) => {
  console.log('POST /api/product')
  console.log(req.body)
 
  let product = new Product()
  product.name = req.body.name
  product.picture = req.body.picture
  product.price = req.body.price
  product.category = req.body.category
  product.description = req.body.description
  product.save((err, productStored) => {
   if(err) res.status(500).send({message: `Error al salvar en la base de datos ${err}` })
   res.status(200).send({product: productStored})
  })
 
})
mongoose.connect('mongodb://localhost:27017/shop', (err, res) => {
  if (err) throw err
  console.log('Conexion establecida a la base de datos...')
 
  app.listen(port, () => {
   console.log(`API REST corriendo en http://localhost:${port}`);
  })
})

Ahora con POSTMAN, introducimos los campos y obtenemos en consola

POST /api/product
[Object: null prototype] {
  name: 'macBook',
  price: '399',
  picture: 'dfs.png',
  category: 'computers',
  description: 'El portalit chulo'
}

Si vemos en la consola de mongo

mongo
show dbs
use shop
db.products.find()
{ "_id" : ObjectId("616748bb5ac107af1c39fd36"), "price" : 399, "name" : "macBook", "picture" : "dfs.png", "category" : "computers", "description" : "El portalit chulo", "__v" : 0 }

Hacemos el get

app.get('/api/product', (req, res) => {

  Product.find({}, (err,products) => {
    if ( err) return res.status(500).send({message: `Error al realizar la petición: ${err}`})
    res.status(200).send( { products })
  })

})

app.get('/api/product/:productId', (req, res) => {
    let productId = req.params.productId

   Product.findById(productId, (err, product) => {
    if(err) return res.status(500).send({message: `Error al realizar la patición: ${err}`})
   if(!product) return res.status(404).send({message: `El producto no existe`})

   res.status(200).send({product})
  })
})

Hacemos el put y el delete

app.put('/api/product/:productId', (req, res) => {
  let productId = req.params.productId
  let update = req.body

  Product.findByIdAndUpdate(productId, update, (err, productUpdated) => {
   if(!update) return res.status(404).send({message: `Error al actualizar el producto: ${err}`})
   if (err) return res.status(500).send({ message: `Error al actualizar el producto: ${err}` })
     res.status(200).send({message: 'El producto ha sido actualizado', product: productUpdated})
  })
})

app.delete('/api/product/:productId', (req, res) => {
  let productId = req.params.productId

  Product.findById(productId, (err, product) => {
   if(!product) return res.status(404).send({message: `Error al borrar el producto: ${err}`})

   product.remove(err => {
    if (err) return res.status(500).send({ message: `Error al borrar el producto: ${err}` })
    res.status(200).send({message: 'El producto ha sido eliminado'})
    })
  })
})

Productos