¿Qué debo considerar al escribir una API Node.js? ¿Debo comenzar con express, hapi u otro?

Express es bastante popular, y ciertamente puedes escribir una API bastante buena con el marco. Sin embargo, sugeriría encarecidamente Hapi.js por dos razones:

1. Mejor estructura de aplicación.

Express usa el middleware Connect para extender la canalización de solicitudes para manejar cosas como la autenticación, el filtrado, etc. Además de eso, tiene una estructura bastante flexible, lo que le brinda mucha flexibilidad, pero también puede ser una molestia en el culo. a largo plazo (cuando aprendes de todos tus errores).

Hapi.js es significativamente más testarudo sobre cómo debe estructurarse su aplicación, y esas opiniones fueron formadas por personas increíblemente inteligentes (estoy bastante seguro de que comprenderá la brillantez de esas decisiones cuando comience a usarla). Algunas de las características estructurales más significativas son:

Complementos

Los complementos en Hapi.js representan un paquete de funcionalidades. No solo se utilizan para utilidades como la autenticación, sino también para modularizar sus propias rutas o vincular servicios al servidor. Otro beneficio es que los complementos se registran en el servidor antes de que el servidor se inicialice, y el servidor no está disponible para solicitudes hasta que se hayan inicializado todos los complementos (llamando a la devolución de llamada).

La definición de complementos es súper fácil:

module.exports.register = (servidor, opciones, siguiente) => {

server.route ({
método: ‘OBTENER’,
ruta: ‘/ ping’,
manejador: función (solicitud, respuesta) {
respuesta (‘pong);
}
});

siguiente();
};

module.exports.register.attributes = {
nombre: ‘ELB Health Route’,
versión: ‘1.0.0’
};

Y luego lo registras así:

server.register ([{
registrarse: require (‘módulo de salud’),
opciones: config
}], (err) => {
server.start (() => {
server.log (
[‘info’],
`Servidor que se ejecuta en: $ {server.info.uri}`);
});
});

Nota: es una variedad de módulos para registrar, que incluirá complementos de la comunidad, sus módulos, etc.

Manejadores + Metadatos

Otra cosa que realmente me gusta de Hapi es que coloca metadatos de ruta con el controlador. Entonces, cuando desee agregar cosas como “roles” válidos para una ruta, validación de parámetro / consulta / cuerpo de solicitud, etc., está allí (no está bloqueado en algunos middleware de Connect, dios sabe en qué parte de su aplicación). Además, es una configuración hermosa y declarativa, no una función en una cadena de controladores.

Aquí hay un ejemplo de la documentación de Hapi.js sobre cómo configurar el almacenamiento en caché para una ruta individual:

server.route ({
ruta: ‘/ hapi / {ttl?}’,
método: ‘OBTENER’,
manejador: función (solicitud, respuesta) {
respuesta constante = respuesta ({be: ‘hapi’});
if (request.params.ttl) {
response.ttl (request.params.ttl);
}
},
config: {
caché: {
expira en: 30 * 1000,
privacidad: ‘privado’
}
}
});

Métodos de servidor

Finalmente, me gustaría tocar algo que es un problema universal que he visto con los proyectos Node: la gestión de dependencias . Muchos marcos, como Express, te dejan esto para que lo resuelvas. Por lo general, verá que muchos proyectos de Nodo importan sus dependencias directamente en sus módulos (lo que hace que sea muy difícil realizar una prueba unitaria) o construirán un gráfico de objetos en el módulo raíz (por ejemplo, index.js) y escribirán submódulos como funciones que se invocarán con dependencias cuando se importen.

Hapi tiene una mejor estrategia y se llaman métodos de servidor . Básicamente, son una forma de agregar funcionalidad al objeto Servidor , pero de una manera aprobada / segura:

server.method (‘lookupUser’, (userId, callback) => {
db.lookup (userId, (err, user) => {
si (err)
server.log ([‘error’], `No se pudo buscar usuario: $ {err}`);
devolución de llamada (err, usuario);
});
}, {});

Y para llamar a este método:

// ¡Buenos manejadores de respuestas!
let Boom = require (‘boom’);

server.route ({
método: ‘OBTENER’,
ruta: ‘/ user / {userId}’,
manejador: función (solicitud, respuesta) {
server.methods.lookupUser (
request.params.userId, (err, user) => {
si (err)
return reply (Boom.badImplementation (‘¡Uy!’, err));
responder (usuario);
});
}
});

Si bien no es una inyección de dependencias (una especie de patrón de localizador de servicios), es significativamente mejor que las dependencias de codificación en los controladores de su enrutador. Lo bueno es que puede empaquetar estas dependencias en un complemento e intercambiarlas con cosas como “simulacros” si desea probar unitariamente sus controladores.

2. Menos ruido .

Hay menos módulos y extensiones en Hapi que Express, pero la mayoría son de muy alta calidad. Por lo tanto, no se enfrenta a una abrumadora cantidad de opciones. Además, la comunidad Hapi, que en realidad es bastante grande, ha demostrado mucha moderación al mejorar los complementos que existen en lugar de crear sus propias versiones de cosas.

He usado Koa.js. Gira en torno al uso de generadores ES6, por lo que es muy elegante y fácil de trabajar en ese sentido. Recomiendo simplemente saltar a él. No conozco a nadie que cree API serias solo con Vanilla Express … no tiene suficiente funcionalidad incorporada solo con express.

Express.js tiene una gran base de usuarios y la fundación node.js la ha adoptado recientemente como parte de la base para que pueda garantizarle que encontrará muchos recursos en la red. Intente leer un libro llamado “Desarrollo web con nodo y expreso” de Ethan Brown. Es un buen libro que lo iniciará en el mundo de node.js y cubrirá algunas respuestas básicas a todas sus preguntas.