method-override middleware
Consente di utilizzare verbi HTTP come PUT o DELETE in luoghi in cui il client non lo supporta.
Installa
Questo è un modulo Node.js disponibile attraverso la
npm registry. L’installazione viene eseguita usando il comando
npm install:
$ npm install method-overrideAPI
NOTA È molto importante che questo modulo sia usato prima qualsiasi modulo che
abbia bisogno di conoscere il metodo della richiesta (ad esempio, deve essere usato prima di
il modulo csurf).
methodOverride(getter, opzioni)
Crea una nuova funzione middleware per sovrascrivere la proprietà req.method con un nuovo valore
. Questo valore verrà estratto dal getter.
getter- Il getter da usare per cercare il metodo di richiesta overridden per la richiesta. (predefinito:X-HTTP-Method-Override)options.methods- I metodi consentiti nella richiesta originale devono essere in per controllare un valore di override metodo. (default:['POST'])
Se il metodo trovato è supportato dal core node.js, allora req. ethod sarà impostato su
questo valore, come se fosse stato originariamente quel valore. Il valore req.method
precedente verrà memorizzato in req.originalMethod.
getter
Questo è il metodo per ottenere il valore di override dalla richiesta. Se viene fornita una funzione,
il req viene passato come primo argomento, il res come secondo argomento e il metodo è
che dovrebbe essere restituito. Se viene fornita una stringa, la stringa viene usata per cercare il metodo
con le seguenti regole:
- Se la stringa inizia con
X-, poi viene trattato come il nome di un’intestazione e questa intestazione viene utilizzata per l’override del metodo. Se la richiesta contiene la stessa intestazione più volte, viene utilizzata la prima occorrenza . - Tutte le altre stringhe sono trattate come una chiave nella stringa di interrogazione URL.
options.methods
Questo permette la specificazione di quali metodi la richiesta MUST sia in modo da controllare per
il valore di sovrascrivere il metodo. Questo valore predefinito è solo i metodi POST, che è l’unico metodo in cui l’override
dovrebbe arrivare. Più metodi possono essere specificati qui, ma può introdurre problemi di sicurezza
e causare un comportamento strano quando le richieste di viaggiare attraverso le cache. Questo valore è un array
di metodi in maiuscolo. null può essere specificato per consentire tutti i metodi.
Esempi
sovrascrivi usando un’intestazione
Per usare un’intestazione per sovrascrivere il metodo, specificare il nome dell’intestazione
come argomento stringa alla funzione methodOverride. Per fare
la chiamata, invia una richiesta POST a un URL con il metodo sovrascritto
come valore di quell’intestazione. Questo metodo di utilizzo di un’intestazione sarebbe
tipicamente usato in combinazione con XMLHttpRequest sulle implementazioni
che non supportano il metodo che stai cercando di usare.
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'));Chiamata di esempio con header sovrascrivere 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);}sovrascrivi usando un valore di interrogazione
Per usare un valore di stringa di query per sovrascrivere il metodo, specificare la stringa di query
come argomento di stringa alla funzione methodOverride.
poi effettuare la chiamata, invia una richiesta POST a un URL con il metodo
sovrascritto come valore di quella chiave di stringa di query. Questo metodo di utilizzo di un valore di query
sarebbe tipicamente usato in combinazione con semplici elementi HTML
\<form> quando si tenta di supportare i browser legacy, ma comunque utilizzare metodi
più recenti.
const express = require('express');const methodOverride = require('method-override');const app = express();
// override with POST having ?_method=DELETEapp.use(methodOverride('_method'));Esempio di chiamata con l’override della query usando HTML \<form>:
<form method="POST" action="/resource?_method=DELETE"> <button type="submit">Delete resource</button></form>supporto formato multiplo
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')); // IBMlogica personalizzata
Puoi implementare qualsiasi tipo di logica personalizzata con una funzione per il getter. La seguente
implementa la logica per cercare in req.body che era in 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; } }));Esempio di chiamata con l’override della query 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>