Cómo crear una API de NodeJS sin usar un marco

Cómo crear una API de NodeJS sin usar un marco

Node.js es un tiempo de ejecución de JavaScript de código abierto basado en el motor v8 de Chrome que le permite ejecutar código JavaScript fuera de un navegador.





Su modelo de eventos, ecosistema y velocidad han convertido a Node.js en uno de los tiempos de ejecución más buscados y utilizados para aplicaciones del lado del servidor.





La mayoría de los servidores API de Node.js usan Express u otro marco. Sin embargo, también puede crear una API de Node.js simple sin un marco en solo unos pocos pasos.





MAKEUSEOF VÍDEO DEL DÍA

Paso 1: Configuración de su entorno de desarrollo

Cree un directorio de proyectos y discos compactos en él ejecutando:

mkdir nodejs-api 
cd nodejs-api

A continuación, inicialice npm en su proyecto ejecutando:



npm init -y 

Esta API CRUD contará con el uso de MongoDB, una base de datos NoSQL, y su popular ODM, mongoose.

Ejecute el siguiente comando para instalar mangosta :





npm install mongoose 

A continuación, cree un servidor.js archivo en el directorio raíz de su proyecto y agregue el bloque de código a continuación para crear un servidor:

const http = require("http"); 
const server = http.createServer((req, res) => {});

server.listen(3000, () => {
console.log(`Server is running`);
});

Este bloque de código importa el módulo http, un módulo central de Node.js. El módulo http permite que Node.js transfiera datos a través de HTTP. Este módulo contiene los métodos necesarios para crear un servidor.





A continuación, llama al módulo http crearServidor método que crea y devuelve una instancia de un servidor. los crearServidor El método toma una función de devolución de llamada con un objeto de solicitud y respuesta como parámetros.

A continuación, el código llama al escuchar método en la instancia de servidor devuelta. Esto permite que el servidor comience a escuchar el tráfico en el puerto dado. los escuchar El método dispara una devolución de llamada, el segundo argumento, cuando tiene éxito.

Finalmente, cree dos directorios llamados rutas y modelos en el directorio raíz de su proyecto. los rutas carpeta contendrá la lógica de enrutamiento para su API, mientras que modelo contendrá todo lo relacionado con la base de datos.

Paso 2: Conexión de su aplicación a una base de datos

En servidor.js , importar mangosta :

const mongoose = require("mongoose"); 

Llama a conectar método en mangosta y pase su MongoDB URI como argumento:

mongoose.connect("MongoDB_URI") 

Paso 3: Creación de un modelo de API

Cree una API CRUD para una aplicación de blog simple. En tus modelos carpeta, cree una blogModel.js archivo y agregue el siguiente código a su archivo:

const mongoose = require("mongoose"); 
const blogSchema = mongoose.Schema({
title: {
type: String,
required: [true, "Blog must have a title"],
},
body: {
type: String,
required: [true, "Blog must have a body"],
},
});
module.exports = mongoose.model("Blog", blogSchema);

El bloque de código anterior crea un modelo de mangosta con dos propiedades y las asigna a una base de datos MongoDB.

Ambas propiedades en este modelo tienen una Cuerda escribir con requerido ajustado a verdadero . Los mensajes de error adjuntos se mostrarán si el cuerpo de una solicitud no contiene ninguna de las propiedades.

La línea final crea y exporta un modelo de mangosta llamando al modelo método en mangosta. Pase el nombre del modelo ( Blog ) como primer argumento y un esquema ( blogHorario ) como segundo argumento.

Paso 4: Implementación de enrutamiento en su aplicación

Sin la ayuda de marcos como Express , deberá crear manualmente la lógica para manejar cada solicitud realizada a su API.

Primero, crea un blogRoutes.js archivo en su rutas carpeta, luego importe el modelo de blog:

const Blog = require("../models/blogModel"); 

A continuación, cree un asíncrono enrutador función, pasar requerimiento y resolución como parámetros, y exportar la función:

const router = async function (req, res) {}; 
module.exports = router;

Esta función contendrá toda su lógica de enrutamiento.

A continuación, implementará la lógica de enrutamiento ruta por ruta.

OBTENER Rutas

Agregue el bloque de código a continuación a su enrutador función para implementar la OBTENER controlador de ruta para las solicitudes realizadas a /api/blogs :

//  GET: /api/blogs 
if (req.url === "/api/blogs" && req.method === "GET") {
// get all blogs
const blogs = await Blog.find();

// set the status code and content-type
res.writeHead(200, { "Content-Type": "application/json" });

// send data
res.end(JSON.stringify(blogs));
}

El bloque de código anterior comprueba la URL y método propiedades del objeto de solicitud. A continuación, obtiene todos los blogs de la base de datos a través de la encontrar método en el modelo de mangosta ( Blog ).

A continuación, llama al cabeza de escritura método en resolución , el objeto de respuesta. Este método envía un encabezado de respuesta con tres argumentos: un código de estado, un mensaje de estado opcional y encabezados. los 200 El código de estado representa una respuesta exitosa y el tipo de contenido para esta llamada a la API se establece en aplicación/json .

Finalmente, cierre la solicitud para asegurarse de que el servidor no se cuelgue llamando al final método en resolución . la llamada a JSON.stringify convierte el blogs objeto a una cadena JSON y pasar eso a la final el método lo devuelve como el cuerpo de la respuesta.

Agregue el bloque de código a continuación a su enrutador función para implementar la OBTENER controlador de ruta para un solo recurso:

// GET: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "GET") {
try {
// extract id from url
const id = req.url.split("/")[3];

// get blog from DB
const blog = await Blog.findById(id);

if (blog) {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(blog));
} else {
throw new Error("Blog does not exist");
}
} catch (error) {
res.writeHead(404, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: error }));
}
}

Este código utiliza el juego método, que toma una expresión regular como argumento, para verificar si la URL coincide con el formato: /api/blogs/ .

A continuación, extraiga el identificación propiedad de la URL cadena llamando a su separar método. Este método toma un patrón como argumento ( / ), divide la cadena según el patrón y devuelve una matriz. El tercer elemento de esa matriz es el identificación .

Finalmente, recupere el documento con la coincidencia identificación de su base de datos. Si existe, envíe un código de respuesta de 200 , cierre la solicitud y envíe el blog recuperado. Si no existe, lanza un error y envíalo como respuesta en el bloque catch.

Ruta POST

Agregue el bloque de código a continuación a su función de enrutador para implementar el CORREO controlador de ruta:

// POST: /api/blogs/ 
if (req.url === "/api/blogs" && req.method === "POST") {
try {
let body = "";

// Listen for data event
req.on("data", (chunk) => {
body += chunk.toString();
});

// Listen for end event
req.on("end", async () => {
// Create Blog
let blog = new Blog(JSON.parse(body));

// Save to DB
await blog.save();
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(blog));
});
} catch (error) {
console.log(error);
}
}

El objeto de solicitud implementa el Node.js ReadableStream interfaz. Esta corriente emite un datos y un final evento que le da acceso a los datos del cuerpo de la solicitud.

Este código escucha el evento de datos y lo maneja convirtiéndolo en una cadena y concatenándolo al cuerpo variable. En el final controlador de eventos, crea un Blog instancia con la cadena de cuerpo analizada. Luego guarda el nuevo blog, envía el código de estado y el encabezado de contenido y cierra la solicitud.

Poner ruta

Agregue el bloque de código a continuación a su función de enrutador para implementar el PONER controlador de ruta:

// PUT: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "PUT") {
try {
// extract id from url
const id = req.url.split("/")[3];
let body = "";

req.on("data", (chunk) => {
body += chunk.toString();
});
req.on("end", async () => {
// Find and update document
let updatedBlog = await Blog.findByIdAndUpdate(id, JSON.parse(body), {
new: true,
});

res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(updatedBlog));
});
} catch (error) {
console.log(error);
}
}

El controlador de solicitudes PUT es casi idéntico al CORREO controlador de solicitudes, excepto que extrae el identificación propiedad de la URL para actualizar el blog correspondiente.

ELIMINAR ruta

Agregue el bloque de código a continuación a la función de su enrutador para implementar su ELIMINAR controlador de ruta:

// DELETE: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "DELETE") {
try {
const id = req.url.split("/")[3];

// Delete blog from DB
await Blog.findByIdAndDelete(id);
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: "Blog deleted successfully" }));
} catch (error) {
res.writeHead(404, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: error }));
}
}

Este bloque de código extrae el identificación desde el URL , elimina el documento con la coincidencia identificación , envía el código de estado y los encabezados y cierra la solicitud.

Finalmente, importa enrutador en tus servidor.js presentar y llamar a su enrutador función, pasando requerimiento y resolución como argumentos:

const router = require("./routes/blogRoutes"); 

const server = http.createServer((req, res) => {
router(req, res);
});

Esto permite que su servidor intercepte y maneje las solicitudes de manera adecuada.

que te paguen por probar aplicaciones de Android

Puedes encontrar el proyecto terminado en este repositorio GitHub .

Usando un marco Node.js

Aunque es posible crear una API web a mano, puede ser una tarea difícil. Deberá asegurarse de haber cubierto muchos casos extremos y es mejor que su código esté libre de errores.

A lo largo de los años, los desarrolladores han creado marcos como ExpressJS, NestJS, Fastify, etc., para hacerlo mucho más fácil.