middleware method-override
Te permite usar verbos HTTP como PUT o DELETE en lugares donde el cliente no lo soporta.
Instalar
Este es un módulo de Node.js disponible a través del
registro npm. La instalación se hace usando el
comando npm install:
npm install method-overrideyarn add method-overridepnpm add method-overridebun add method-overrideAPI
NOTA Es muy importante que este módulo se use antes de cualquier módulo que
necesite conocer el método de la petición (por ejemplo, debe usarse antes del
módulo csurf).
methodOverride(getter, options)
Crea una nueva función de middleware para sobrescribir la propiedad req.method con un nuevo
valor. Este valor se obtendrá del getter proporcionado.
getter- El getter a usar para buscar el método de petición sobrescrito para la petición. (por defecto:X-HTTP-Method-Override)options.methods- Los métodos permitidos en los que debe estar la petición original para comprobar un valor de sobrescritura de método. (por defecto:['POST'])
Si el método encontrado es soportado por el núcleo de node.js, entonces req.method se establecerá
a este valor, como si originalmente hubiera sido ese valor. El valor anterior de req.method
se almacenará en req.originalMethod.
getter
Este es el método para obtener el valor de override de la solicitud. Si se proporciona una función,
el req se pasa como primer argumento, el res como segundo argumento y se espera
que se devuelva el método. Si se proporciona una cadena, la cadena se usa para buscar el método
con las siguientes reglas:
- Si la cadena empieza con
X-, entonces se trata como el nombre de un encabezado y ese encabezado se usa para la sobrescritura del método. Si la petición contiene el mismo encabezado múltiples veces, se usa la primera ocurrencia. - Todas las demás cadenas se tratan como una clave en la cadena de consulta de la URL.
options.methods
Esto permite especificar en qué método(s) DEBE estar la petición para comprobar el valor de
sobrescritura del método. Por defecto solo métodos POST, que es el único método en el que
debe llegar la sobrescritura. Se pueden especificar más métodos aquí, pero puede introducir problemas
de seguridad y causar comportamientos extraños cuando las peticiones viajan a través de cachés. Este valor
es un array de métodos en mayúsculas. Se puede especificar null para permitir todos los métodos.
Ejemplos
sobrescribir usando un encabezado
Para usar un encabezado para sobrescribir el método, especifica el nombre del encabezado
como argumento de cadena a la función methodOverride. Para luego hacer la llamada,
envía una petición POST a una URL con el método sobrescrito como valor de ese encabezado.
Este método de uso de un encabezado se usaría típicamente en conjunto con XMLHttpRequest
en implementaciones que no soportan el método que estás intentando usar.
const express = require('express');const methodOverride = require('method-override');const app = express();
// override with the X-HTTP-Method-Override header in the requestapp.use(methodOverride('X-HTTP-Method-Override'));Ejemplo de llamada con sobrescritura de encabezado usando XMLHttpRequest:
const xhr = new XMLHttpRequest();xhr.onload = onload;xhr.open('post', '/resource', true);xhr.setRequestHeader('X-HTTP-Method-Override', 'DELETE');xhr.send();
function onload() { alert('got response: ' + this.responseText);}sobrescribir usando un valor de consulta
Para usar un valor de cadena de consulta para sobrescribir el método, especifica la clave
de cadena de consulta como argumento de cadena a la función methodOverride. Para luego
hacer la llamada, envía una petición POST a una URL con el método sobrescrito como valor
de esa clave de cadena de consulta. Este método de uso de un valor de consulta se usaría
típicamente en conjunto con elementos <form> HTML simples cuando se intenta soportar
navegadores antiguos pero aún usar métodos más nuevos.
const express = require('express');const methodOverride = require('method-override');const app = express();
// override with POST having ?_method=DELETEapp.use(methodOverride('_method'));Ejemplo de llamada con sobrescritura de consulta usando HTML <form>:
<form method="POST" action="/resource?_method=DELETE"> <button type="submit">Delete resource</button></form>soporte de múltiples formatos
const express = require('express');const methodOverride = require('method-override');const app = express();
// override with different headers; last one takes precedenceapp.use(methodOverride('X-HTTP-Method')); // Microsoftapp.use(methodOverride('X-HTTP-Method-Override')); // Google/GDataapp.use(methodOverride('X-Method-Override')); // IBMlógica personalizada
Puedes implementar cualquier tipo de lógica personalizada con una función para el getter. Lo siguiente
implementa la lógica para buscar en req.body que estaba en method-override@1:
const bodyParser = require('body-parser');const express = require('express');const methodOverride = require('method-override');const app = express();
// NOTE: when using req.body, you must fully parse the request body// before you call methodOverride() in your middleware stack,// otherwise req.body will not be populated.app.use(bodyParser.urlencoded());app.use( methodOverride(function (req, res) { if (req.body && typeof req.body === 'object' && '_method' in req.body) { // look in urlencoded POST bodies and delete it const method = req.body._method; delete req.body._method; return method; } }));Ejemplo de llamada con sobrescritura de consulta usando HTML <form>:
{/* enctype must be set to the type you will parse before methodOverride() */}<form method="POST" action="/resource" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="_method" value="DELETE" /> <button type="submit">Delete resource</button></form>