Introducción a Express.js:aplicación API REST simple con Monk y MongoDB

¿Por qué?

Después de mirar las estadísticas de Google Analytics, me di cuenta de que existe una demanda de tutoriales breves de Node.js y guías de inicio rápido. Esta es una introducción a Express.js, probablemente el framework de Node.js más popular (desde abril de 2013).

Express.js — Marco Node.js

mongoui

Esta aplicación es un comienzo del proyecto mongoui. Una contraparte de phpMyAdmin para MongoDB escrita en Node.js. El objetivo es proporcionar un módulo con una buena interfaz de usuario de administración web. Será algo como Parse.com, Firebase.com, MongoHQ o MongoLab pero sin probarlo para ningún servicio en particular. ¿Por qué tenemos que escribir db.users.findOne({'_id':ObjectId('...')})? en cualquier momento queremos buscar la información del usuario? La alternativa de la aplicación para mac MongoHub es agradable (y gratuita), pero es complicada de usar y no está basada en la web.

Aplicación API REST con Express.js y Monk

A los entusiastas de Ruby les gusta comparar Express con el marco Sinatra. Es igualmente flexible en la forma en que los desarrolladores pueden crear sus aplicaciones. Las rutas de aplicación se configuran de manera similar, es decir, app.get('/products/:id', showProduct); . Actualmente, Express.js tiene la versión número 3.1. Además de Express, usaremos el módulo Monk.

Usaremos Node Package Manager, que generalmente viene con una instalación de Node.js. Si aún no lo tiene, puede obtenerlo en npmjs.org.

Cree una nueva carpeta y un archivo de configuración de NPM, package.json , en ella con el siguiente contenido:

{
  "name": "mongoui",
  "version": "0.0.1",
  "engines": {
    "node": ">= v0.6"
  },
  "dependencies": {
    "mongodb":"1.2.14",
    "monk": "0.7.1",
    "express": "3.1.0"
  }
}

Ahora ejecuta npm install para descargar e instalar módulos en node_module carpeta. Si todo salió bien, verá un montón de carpetas en node_modules carpetas Todo el código de nuestra aplicación estará en un archivo, index.js , para mantenerlo simple y estúpido:

var mongo = require('mongodb');
var express = require('express');
var monk = require('monk');
var db =  monk('localhost:27017/test');
var app = new express();

app.use(express.static(__dirname + '/public'));
app.get('/',function(req,res){
  db.driver.admin.listDatabases(function(e,dbs){
      res.json(dbs);
  });
});
app.get('/collections',function(req,res){
  db.driver.collectionNames(function(e,names){
    res.json(names);
  })
});
app.get('/collections/:name',function(req,res){
  var collection = db.get(req.params.name);
  collection.find({},{limit:20},function(e,docs){
    res.json(docs);
  })
});
app.listen(3000)

Vamos a desglosar el código pieza por pieza. Declaración del módulo:

var mongo = require('mongodb');
var express = require('express');
var monk = require('monk');

Base de datos y creación de instancias de aplicaciones Express:

var db =  monk('localhost:27017/test');
var app = new express();

Dígale a la aplicación Express que cargue y sirva archivos estáticos (si los hay) desde la carpeta pública:

app.use(express.static(__dirname + '/public'));

Página de inicio, también conocida como ruta raíz, configurar:

app.get('/',function(req,res){
  db.driver.admin.listDatabases(function(e,dbs){
      res.json(dbs);
  });
});

get() La función solo toma dos parámetros:cadena y función. La cadena puede tener barras y dos puntos, por ejemplo product/:id . La función debe tener dos parapetos de solicitud y respuesta. La solicitud tiene toda la información, como los parámetros de la cadena de consulta, la sesión, los encabezados y la respuesta es un objeto con el que mostramos los resultados. En este caso lo hacemos llamando a res.json() función. db.driver.admin.listDatabases() como puede adivinar, dénos una lista de bases de datos de manera asíncrona.

Otras dos rutas se configuran de manera similar con get() función:

app.get('/collections',function(req,res){
  db.driver.collectionNames(function(e,names){
    res.json(names);
  })
});
app.get('/collections/:name',function(req,res){
  var collection = db.get(req.params.name);
  collection.find({},{limit:20},function(e,docs){
    res.json(docs);
  })
});

Express admite convenientemente otros verbos HTTP como publicar y actualizar. En el caso de configurar una ruta de publicación escribimos esto:

app.post('product/:id',function(req,res) {...});

Express también tiene soporte para middeware. El middleware es solo un controlador de función de solicitud con tres parámetros:request , response y next . Por ejemplo:

app.post('product/:id', authenticateUser, validateProduct, addProduct);

function authenticateUser(req,res, next) {
  //check req.session for authentication
  next();
}

function validateProduct (req, res, next) {
   //validate submitted data
   next();
}

function addProduct (req, res) {
  //save data to database
}

validarProducto y autenticarProducto son middleware. Por lo general, se colocan en un archivo (o archivos) separados en proyectos grandes.

[Nota al margen]

Leer publicaciones de blog es bueno, pero ver cursos en video es aún mejor porque son más atractivos.

Muchos desarrolladores se quejaron de la falta de material de video de calidad asequible en Node. Es una distracción ver videos de YouTube y una locura pagar $ 500 por un curso de video de Node.

Visite Node University, que tiene cursos de video GRATUITOS en Node:node.university.

[Fin de la nota al margen]

Otra forma de configurar el middleware en la aplicación Express es usar use() función. Por ejemplo, anteriormente hicimos esto para activos estáticos:

app.use(express.static(__dirname + '/public'));

También podemos hacerlo para los controladores de errores:

app.use(errorHandler);

Suponiendo que tiene mongoDB instalado, esta aplicación se conectará a ella (localhost:27017) y mostrará el nombre de la colección y los elementos de las colecciones. Para iniciar el servidor mongo:

$ mongod

para ejecutar la aplicación (mantenga abierta la ventana del terminal mongod):

$ node .

o

$ node index.js

Para ver el funcionamiento de la aplicación, abra http://localhost:3000 en Chrome con la extensión JSONViewer (para representar JSON correctamente).

El expreso polar de Tom Hanks