Crear una API REST con Node.js y una base de datos Oracle

Hola Habr! Le presento la traducción del artículo "Creación de una API REST: conceptos básicos del servidor web" .

Parte 1. Crear una API REST: conceptos básicos del servidor web


El servidor web es uno de los componentes más importantes de la API REST. En esta publicación, comenzará su proyecto de API REST creando algunos directorios y archivos iniciales. Luego crea el módulo del servidor web y lo conecta para que el servidor web se inicie y se apague correctamente.

El código en este proyecto se organizará utilizando una estructura de directorio común, que se puede ajustar y construir con el tiempo según sea necesario.

cd ~ mkdir hr_app cd hr_app/ touch index.js mkdir config touch config/web-server.js mkdir controllers mkdir db_apis mkdir services touch services/web-server.js 

El archivo index.js puede considerarse como el archivo "principal" en la aplicación. Será el punto de entrada a la aplicación. Agregaremos código a este archivo y a los archivos web-server.js en los directorios de configuración y servicios.

Pegue el siguiente código en el archivo Inicio> hr_app> config> web-server.js

 module.exports = { port: process.env.HTTP_PORT || 3000 }; 

En Node.js, un objeto de proceso tiene una propiedad env que contiene un entorno de usuario. Lo uso para establecer el valor del puerto en el valor de la variable de entorno HTTP_PORT. Si esta variable de entorno no está definida, el valor predeterminado es 3000.

Pegue el siguiente código en el archivo Inicio> hr_app> servicios> web-server.js

 const http = require('http'); const express = require('express'); const webServerConfig = require('../config/web-server.js'); let httpServer; function initialize() { return new Promise((resolve, reject) => { const app = express(); httpServer = http.createServer(app); app.get('/', (req, res) => { res.end('Hello World!'); }); httpServer.listen(webServerConfig.port) .on('listening', () => { console.log(`Web server listening on localhost:${webServerConfig.port}`); resolve(); }) .on('error', err => { reject(err); }); }); } module.exports.initialize = initialize; 

Líneas 1-3: se requieren múltiples módulos. El módulo http está incluido en Node.js, pero el módulo Express deberá instalarse a través de npm.

Líneas 7-27: se declara una función llamada initialize. La función devuelve inmediatamente una promesa, que se permite o rechaza dependiendo de si el servidor web se inició correctamente.

Líneas 9-10: se crea una nueva aplicación express (que en realidad es solo una función) y luego se usa para crear un servidor http a través del módulo http.

Líneas 12-14: El método get de la aplicación se usa para agregar un controlador para las solicitudes GET que llegan a la ruta raíz (/). La función de devolución de llamada se llamará al recibir dicha solicitud, y utilizará el parámetro "res" (res) para enviar la respuesta "¡Hola Mundo!" Al cliente

Líneas 16-24: el método de escucha del servidor se utiliza para enlazar con el puerto especificado y comenzar a escuchar las solicitudes entrantes.

Línea 28: exportando el módulo para que pueda usarse externamente

Pegue el siguiente código en el archivo Inicio> hr_app> index.js

 const webServer = require('./services/web-server.js'); async function startup() { console.log('Starting application'); try { console.log('Initializing web server module'); await webServer.initialize(); } catch (err) { console.error(err); process.exit(1); // Non-zero failure code } } startup(); 

Conectamos el módulo del servidor web, y luego determina y llama a la función de inicio asíncrono. Dado que la función de inicialización del servidor web devuelve una promesa, puede usarla con async / await y envolverla en un bloque try-catch. Si la función de inicialización tiene éxito, el servidor web funcionará; de lo contrario, cualquier excepción será capturada y procesada. Todo lo que tiene que hacer ahora es inicializar npm e instalar Express, luego puede iniciar la aplicación. Ejecute los siguientes comandos en una terminal desde el directorio hr_app.

 npm init -y npm install express -s node . 

El comando npm init se usa para crear el archivo package.json, que npm usa como archivo de manifiesto (el indicador -y acepta las opciones predeterminadas). El comando npm install se usa para instalar express (el indicador -s agrega express a la lista de dependencias en package.json). Npm almacena los módulos que instala en el directorio node_modules. También crea un archivo llamado package.lock.json para proporcionar un árbol idéntico para el equipo de desarrollo.

¿Ves el mensaje Servidor web escuchando en localhost: 3000? ¡Felicitaciones, ha creado un servidor express basado en!

Y aquí está, otro "Hola Mundo". Aunque no es particularmente divertido, este es un primer paso importante para su API.

Cuando esté listo, puede apagar el servidor volviendo al terminal y presionando ctrl + c.

imagen

Apagado controlado


Durante el apagado presionando Ctrl + C, no tiene control sobre cómo sucedió esto. Para controlar el proceso de apagado, debe cerrar explícitamente el servidor web y salir del proceso Node.js.

Pegue el siguiente código en el archivo Inicio> hr_app> servicios> web-server.js

 // *** previous code above this line *** function close() { return new Promise((resolve, reject) => { httpServer.close((err) => { if (err) { reject(err); return; } resolve(); }); }); } module.exports.close = close; 

La función de cierre devuelve una promesa que se resuelve cuando el servidor web se cierra correctamente. El método httpServer.close detiene el establecimiento de nuevas conexiones, pero no obliga a cerrar las conexiones ya abiertas. Dependiendo de cuántas conexiones estén abiertas y de lo que estén haciendo, es posible que deba esperar un poco hasta que funcione la devolución de llamada. Aunque no lo hará en este módulo, puede usar códigos personalizados o módulos npm como http-shutdown para forzar el cierre de las conexiones abiertas.

Pegue el siguiente código en el archivo Inicio> hr_app> index.js

 // *** previous code above this line *** async function shutdown(e) { let err = e; console.log('Shutting down'); try { console.log('Closing web server module'); await webServer.close(); } catch (e) { console.log('Encountered error', e); err = err || e; } console.log('Exiting process'); if (err) { process.exit(1); // Non-zero failure code } else { process.exit(0); } } process.on('SIGTERM', () => { console.log('Received SIGTERM'); shutdown(); }); process.on('SIGINT', () => { console.log('Received SIGINT'); shutdown(); }); process.on('uncaughtException', err => { console.log('Uncaught exception'); console.error(err); shutdown(err); }); 

Los eventos SIGINT y SIGTERM se relacionan con señales que se pueden enviar a un proceso para cerrarlo, por ejemplo, cuando se presiona ctrl + c. Se producirá un evento de excepción no capturada cuando se produce un error de JavaScript, pero no se detecta y se maneja utilizando la instrucción try-catch. Intente iniciar y cerrar la aplicación nuevamente. Descubrirá que todo funciona correctamente cuando vea mensajes de "apagado" en el terminal.

Registro en el servidor


Hay una cosa más que completa nuestro módulo de servidor web: el registro HTTP. Hay varios módulos que puede usar para este tipo de inicio de sesión, pero Morgan es uno de los más simples. Instalemos Morgan usando npm.

 npm install morgan -s 

Luego agregue la siguiente línea a services / web-server.js debajo de la línea que requiere express (línea 2):

 const morgan = require('morgan'); 

Ahora puede habilitar la función Morgan como middleware a través del cual se procesarán todas las solicitudes utilizando app.use. Agregue esta línea antes de llamar a app.get, que muestra el mensaje "hola mundo".

 // Combines logging info from request and response app.use(morgan('combined')); // *** app.get call below this line *** 

Tenga en cuenta que app.use crea una canalización de funciones de middleware que pueden interactuar con las solicitudes y respuestas HTTP. Las funciones de middleware se ejecutarán en el orden en que están habilitadas. Reinicie la aplicación e instale la terminal para que pueda verla y el navegador al mismo tiempo. Cada vez que vuelva a cargar la página, debería ver una nueva entrada de registro en el terminal. Por defecto, Morgan pasa la información de registro a STDOUT (que se muestra en el terminal).

El siguiente artículo cubrirá los conceptos básicos del trabajo con bases de datos, incluidos los grupos de conexiones, que lo ayudarán a comprender y construir la API REST para Node.js.

Source: https://habr.com/ru/post/473234/


All Articles