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
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"
}
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'})
})
})
})