Cómo crear un middleware personalizado en Express.js
Introducción
El middleware es una función que ejecuta el método de ciclo de vida en un servidor Express y utiliza los ciclos request
y response
. Express.js ofrece middleware integrado y le permite producir versiones personalizadas para funciones precisas, como evitar que un usuario realice una determinada operación o registrar la ruta de una solicitud entrante a su aplicación.
En este artículo, aprenderá cómo crear un middleware personalizado en Express.js.
Prerrequisitos
Para seguir este artículo necesitarás:
- Se recomienda tener conocimientos generales de Node.js, pero no es obligatorio. Para obtener más información sobre Node.js, consulta nuestra serie Cómo codificar en Node.js.
- Una comprensión general de los ciclos
request
yresponse
. Consulta nuestros tutoriales sobre Cómo usar elreq
objeto en Express y Cómo usar elres
objeto en Express . - Node.js instalado localmente, lo cual puedes hacer siguiendo Cómo instalar Node.js y crear un entorno de desarrollo local .
Análisis de un middleware Express
Todas las funciones de middleware en Express.js aceptan tres argumentos después de los request
métodos de ciclo de vida response
, y next
. En su index.js
archivo, defina una función con los tres métodos de ciclo de vida como argumentos:
índice.js
function myCustomMiddleware(req, res, next) { // ...}
El primer argumento, req
, es una abreviatura del request
objeto con propiedades integradas para acceder a los datos desde el lado del cliente y facilitar las solicitudes HTTP. El res
argumento es el response
objeto con métodos integrados para enviar datos al lado del cliente a través de solicitudes HTTP. El argumento, next
, es una función que le indica a Express.js que continúe con el siguiente middleware que ha configurado para su aplicación.
El middleware tiene la capacidad de modificar los objetos req
y res
, ejecutar cualquier código que desee, finalizar el request
ciclo response
y y pasar a las siguientes funciones.
Tenga en cuenta el orden de su middleware, ya que next()
es necesario invocar la función en cada middleware anterior.
Ahora que ha revisado los tres argumentos que construyen un middleware, veamos cómo ensamblar un middleware personalizado.
Usando el reqobjeto
Para identificar al usuario que ha iniciado sesión, puede crear un middleware personalizado que pueda obtener al usuario mediante pasos de autenticación. En su setCurrentUser.js
archivo, defina una función que acepte los tres métodos de ciclo de vida como argumentos:
middleware/setCurrentUser.js
// Require in logic from your authentication controllerconst getUserFromToken = require("../getUserFromToken");module.exports = function setCurrentUser(req, res, next) { const token = req.header("authorization"); // look up the user based on the token const user = getUserFromToken(token).then(user = { // append the user object the the request object req.user = user; // call next middleware in the stack next(); });};
Dentro de la setCurrentUser()
función, el req
objeto aplica el método integrado .header()
para devolver el token de acceso de un usuario. Al utilizar el método del controlador de autenticación, getUserFromToken()
, su req.header()
lógica pasa como argumento para buscar al usuario en función de su token. También puede utilizar el req
objeto para definir una propiedad personalizada .user
para almacenar la información del usuario. Una vez que el middleware esté completo, exporte el archivo.
Puede habilitar su middleware personalizado en su servidor Express aplicando el middleware Express.js integrado .use()
.
En su server.js
archivo, cree una instancia de Express y solicite en su setCurrentUser()
middleware personalizado:
servidor.js
const express = require('express');const setCurrentUser = require('./middleware/setCurrentUser.js');const app = express();app.use(setCurrentUser);// ...
El app.use()
middleware acepta su middleware personalizado como argumento y autoriza su lógica en su servidor Express.
Aplicación del resobjeto
También puede crear un middleware personalizado para manejar la funcionalidad de su response
objeto, como diseñar un nuevo encabezado.
En su addNewHeader.js
archivo, defina una función y utilice el .setHeader()
método en el res
objeto:
middleware/addNewHeader.js
module.exports = function addNewHeader(req, res, next) { res.setHeader("X-New-Policy", "Success"); next();};
Aquí, el .setHeader()
método aplicará el nuevo encabezado, Success
, en cada llamada de función. El next()
método le indicará a Express.js que continúe con el siguiente middleware una vez que se complete la ejecución.
Poniendo fin al ciclo Requestdel yResponse
Express.js también le permite finalizar el ciclo request
y response
en su middleware personalizado. Un caso de uso común para un middleware personalizado es validar el conjunto de datos de un usuario en su req
objeto.
En su isLoggedIn.js
archivo, defina una función y establezca una condición para verificar si los datos de un usuario existen en el req
objeto:
middleware/isLoggedIn.js
module.exports = function isLoggedIn(req, res, next) { if (req.user) { next(); } else { // return unauthorized res.send(401, "Unauthorized"); }};
Si los datos del usuario existen en el req
objeto, el middleware personalizado pasará a las siguientes funciones. Si los datos de un usuario en particular no están en el objeto, el .send()
método del res
objeto enviará el código de estado de error 401
y un mensaje al lado del cliente.
Una vez que haya configurado su middleware, exporte el archivo y navegue hasta su servidor Express.js. En su server.js
archivo, solicite e inserte su middleware personalizado como argumento en una GET
solicitud para autenticar a un usuario a través de una única ruta:
servidor.js
const express = require("express");const setCurrentUser = require("./middleware/setCurrentUser.js");const isLoggedIn = require("./middleware/isLoggedIn.js");const app = express();app.use(setCurrentUser);app.get("/users", isLoggedIn, function(req, res) { // ...});
La ruta /users
maneja la lógica dentro de su isLoggedIn
middleware personalizado. Según el orden de su servidor Express, la ruta también puede acceder al setCurrentUser
middleware tal como está definido antes de su GET
solicitud.
Conclusión
Express.js le brinda la posibilidad de personalizar su middleware fuera de los métodos integrados para analizar la autenticación de un usuario y sus datos.
Para obtener más información sobre cómo escribir middleware Express.js personalizado, visita la documentación oficial en el sitio de Express.js.
Deja una respuesta