sobreescribir middleware
Permite usar verbos HTTP como PUT o DELETE en lugares donde el cliente no lo soporta.
Instalar
Este es un módulo Node.js disponible a través del
npm registry. La instalación se realiza usando el comando
npm install:
$ npm install method-overrideAPI
NOTA Es muy importante que este módulo sea usado antes de cualquier módulo que
necesite conocer el método de la solicitud (por ejemplo, que debe ser usado antes de
el módulo csurf).
override(getter, opciones)
Crea una nueva función de middleware para sobreescribir la propiedad req.method con un nuevo valor
. Este valor se extraerá del getter proporcionado.
getter- El getter a usar para buscar el método de solicitud anulada para la solicitud. (por defecto:X-HTTP-Method-Override)options.methods- Los métodos permitidos en los que la solicitud original debe estar para comprobar si hay un valor de sobreescritura de método. (por defecto:['POST'])
Si el método encontrado es soportado por el núcleo node.js, entonces req. ethod se establecerá en
este valor, como si originalmente hubiera sido ese valor. El valor
anterior req.method será almacenado en req.originalMethod.
getter
Este es el método de obtener el valor de anulación de la solicitud. Si se proporciona una función,
se pasa el req como el primer argumento, el res como segundo argumento y el método es
se espera que sea retornado. Si se proporciona una cadena, la cadena se utiliza para buscar el método
con las siguientes reglas:
- Si la cadena comienza con
X-, entonces se trata como el nombre de un encabezado y esa cabecera se utiliza para la sobreescritura del método. If the request contains the same header multiple times, the first occurrence is used. - Todas las demás cadenas son tratadas como una clave en la cadena de consulta URL.
options.methods
Esto permite la especificación de los método(s) que MUST de la solicitud para comprobar si
valor de sobreescritura del método. Esto por defecto solo los métodos POST, que es el único método en el que la sobreescritura
debe llegar. Aquí se pueden especificar más métodos, pero puede introducir problemas de seguridad
y causar un comportamiento extraño cuando las solicitudes viajan a través de cachés. Este valor es un array
de métodos en mayúsculas. null puede ser especificado para permitir todos los métodos.
Ejemplos
anular usando un encabezado
Para usar un encabezado para sobrescribir el método, especifique el nombre de cabecera
como un argumento de cadena a la función methodOverride. Para luego hacer
la llamada, envíe una solicitud POST a una URL con el método reemplazado
como el valor de esa cabecera. Este método de usar un encabezado normalmente
se usaría en conjunto con XMLHttpRequest en implementaciones
que no soportan el método que está intentando utilizar.
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 sobreescritura de cabecera 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, especifique la clave de cadena de consulta
como un argumento de cadena a la función methodOverride. A
luego haz la llamada, envía una solicitud POST a una URL con el método
sobreescrito como el valor de esa clave de cadena de consulta. Este método de usar un valor de consultaformat@@0
normalmente se usaría en conjunto con elementos HTML plano
\<form> cuando se trata de soportar navegadores heredados pero todavía se utilizan 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 anulación 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. La 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 anulación 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>