Para crear nuestra API Rest es necesario tener instalado MongoDB, para ello puedes visitar el post dónde explico cómo hacerlo (link).

El primer paso es crear la carpeta en donde estará nuestra API, en mi caso es api-rest, una vez creada accedemos a ella mediante la consola (CMD), ya estando ahí iniciamos nuestro proyecto Node, para ello ejecutamos el comando:

npm init

Al ejecutar dicho comando, nos solicitara cierta información, como se muestra a continuación:

Una vez inicializado el proyecto procedemos a instalar las siguientes librerías:

  • express (versión 4.17.1)
  • body-parser (versión 1.19.0)
  • mongoose (versión 5.6.6)

El comando para la instalación es:

npm install –save librería

Ahora si es momento de comenzar con el código, para ello he creado la siguiente estructura:

  • index.js
  • api-routes.js
  • models/
  • controllers/

Más los archivos y carpetas que nos generó Node:

  • package.json
  • package-lock.json
  • node_modules/

En el archivo index.js va la declaración del servidor Express y la conexión a MongoDB:

// Importación de express
let express = require('express')

// Importación de Body parser
let bodyParser = require('body-parser');
// Importación de Mongoose
let mongoose = require('mongoose');

// Inicilización de la app
let app = express();

app.use(bodyParser.json());
// Conectando a la Base de datos con Mongoose
mongoose.connect('mongodb://root:root@localhost:27017/api-rest?authSource=admin', { useNewUrlParser: true}).then(() => {
	console.log("Conectado a la Base de Datos");
}).catch((err) => {
    console.log("No conectado a la Base de Datos ERROR! ", err);
});
var db = mongoose.connection;


// Configurando puerto del servidor
var port = process.env.PORT || 9001;
// Enviando mensaje por default
app.get('/', (req, res) => res.send('Hola mundo Express'));

// Importación de routes
let apiRoutes = require("./api-routes")
// Uso de Api routes en la App
app.use('/api', apiRoutes)

// Lanzando la aplicación 
app.listen(port, function () {
     console.log("Running RestHub on port " + port);
});

 

En el archivo api-routes.js declararemos las rutas de nuestra API, en este caso la ruta por default y la de products (ProductController).

// Inicializando el express router
let router = require('express').Router();
// Declarando la respuesta por default
router.get('/', function (req, res) {
    res.json({
        status: 'La API esta trabajando',
        message: 'Bienvenido a la API Rest!'
    });
});


// Importando el controlador de producto
var productController = require('./controllers/productController');
// Product routes
router.route('/products')
    .get(productController.index)
    .post(productController.new);
	
router.route('/products/:product_id')
    .get(productController.view)
    .patch(productController.update)
    .put(productController.update)
    .delete(productController.delete);
	
// Exportando las API routes
module.exports = router;

 

En nuestro productController.js tendremos el manejo del CRUD de nuestro modelo:

// Importando modelo product
Product = require('../models/product');

// Manejar acciones de indice
exports.index = function (req, res) {
    Product.get(function (err, products) {
        if (err) {
            res.json({
                status: "error",
                message: err,
            });
        }
        res.json({
            status: "success",
            message: "Products retrieved successfully",
            data: products
        });
    });
};
// Manejar acciones de creacion de producto.
exports.new = function (req, res) {
    var product = new Product();
    product.name = req.body.name ? req.body.name : product.name;
    product.note = req.body.note;
    product.price = req.body.price;

    product.save(function (err) {

res.json({
            message: 'New product created!',
            data: product
        });
    });
};

// Manejar acciones para ver informacion de producto
exports.view = function (req, res) {
    Product.findById(req.params.product_id, function (err, product) {
        if (err)
            res.send(err);
        res.json({
            message: 'Product details loading..',
            data: product
        });
    });
};
// Manejar acciones para actualizar el producto
exports.update = function (req, res) {
Product.findById(req.params.product_id, function (err, product) {
        if (err)
            res.send(err);
product.name = req.body.name ? req.body.name : product.name;
        product.gender = req.body.gender;
        product.email = req.body.email;
        product.phone = req.body.phone;
        product.save(function (err) {
            if (err)
                res.json(err);
            res.json({
                message: 'Product Info updated',
                data: product
            });
        });
    });
};
// Manejar acciones para eliminacion de producto
exports.delete = function (req, res) {
    Product.remove({
        _id: req.params.product_id
    }, function (err, product) {
        if (err)
            res.send(err);
res.json({
            status: "success",
            message: 'Product deleted'
        });
    });
};

 

Por último, tenemos nuestro modelo, dónde declaramos el Schema con los campos que debe contener, así como la exportación del mismo:

var mongoose = require('mongoose');
// Configurando el schema
var productSchema = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
	note: String,
    price: {
        type: Number,
        required: true
    },
    create_date: {
        type: Date,
        default: Date.now
    }
});
// Exportando el modelo Product
var Product = module.exports = mongoose.model('product', productSchema);
module.exports.get = function (callback, limit) {
    Product.find(callback).limit(limit);
}

 

Para poner en funcionamiento nuestra API basta con ejecutar el comando en CMD:

npm index

El cual ejecutara nuestro archivo index.js e inicializará el servidor Express, para probarlo desde el navegador podemos ejecutarlo desde la siguiente url http://localhost:9001/api/products.

El código del proyecto lo puedes obtener del siguiente repositorio api-rest