substituer le middleware à la méthode
Vous permet d’utiliser des verbes HTTP tels que PUT ou DELETE à des endroits où le client ne le supporte pas.
Installer
Ceci est un module Node.js disponible via
npm registry. L’installation se fait à l’aide de la commande
npm install:
$ npm install method-overrideAPI
NOTE Il est très important que ce module soit utilisé avant tout module que
a besoin de connaître la méthode de la requête (par exemple, il doit être utilisé avant
le module csurf).
remplacement de la méthode (getter, options)
Créez une nouvelle fonction middleware pour remplacer la propriété req.method par une nouvelle valeur
. Cette valeur sera tirée du getter fourni.
getter- L’getter à utiliser pour rechercher la méthode de requête surchargée pour la requête. (par défaut:X-HTTP-Method-Override)options.methods- Les méthodes autorisées dans la requête originale doivent être utilisées pour vérifier si une méthode est remplacée par une valeur. (par défaut:['POST'])
Si la méthode trouvée est supportée par node.js core, alors req. ethod sera défini à
cette valeur, comme si c’était à l’origine cette valeur. La valeur précédente req.method
sera stockée dans req.originalMethod.
obtenteur
C’est la méthode pour obtenir la valeur de remplacement de la requête. Si une fonction est fournie,
le req est passé comme premier argument, le res en tant que deuxième argument et la méthode est
devrait être retourné. Si une chaîne de caractères est fournie, la chaîne est utilisée pour rechercher la méthode
avec les règles suivantes :
- Si la chaîne commence par
X-, alors il est traité comme le nom d’un en-tête et que l’en-tête est utilisé pour le remplacement de la méthode. Si la requête contient le même en-tête plusieurs fois, la première occurrence est utilisée. - Toutes les autres chaînes sont traitées comme une clé dans la chaîne de requête d’URL.
Méthodes
This allows the specification of what methods(s) the request MUST be in in order to check for
the method override value. Par défaut, seules les méthodes POST, qui est la seule méthode dans laquelle la substitution
devrait arriver. D’autres méthodes peuvent être spécifiées ici, mais cela peut introduire des problèmes de sécurité
et causer des comportements bizarres lorsque les requêtes voyagent à travers des caches. Cette valeur est un tableau
de méthodes en majuscule. null peut être spécifié pour autoriser toutes les méthodes.
Exemples
remplacer par un en-tête
Pour utiliser un en-tête pour remplacer la méthode, spécifiez le nom d’en-tête
comme argument de chaîne de la fonction methodOverride. Pour faire
l’appel, envoyez une requête POST à une URL avec la méthode remplacée
comme valeur de cet en-tête. Cette méthode d’utilisation d’un en-tête serait
généralement utilisée en conjonction avec XMLHttpRequest sur les implémentations
qui ne prennent pas en charge la méthode que vous essayez d’utiliser.
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'));Exemple d’appel avec surcharge d’en-tête à l’aide de 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);}outrepasser la valeur d’une requête
Pour utiliser une chaîne de requête pour remplacer la méthode, spécifiez la chaîne de requête
comme argument de chaîne de caractères à la fonction methodOverride. À
puis faites l’appel, envoyer une requête POST à une URL avec la méthode
remplacée comme valeur de cette clé de chaîne de requête. Cette méthode d’utilisation d’une valeur de requête
serait généralement utilisée en conjonction avec des éléments HTML
\<form> lorsque vous essayez de prendre en charge les navigateurs existants mais utilisez toujours
des méthodes plus récentes.
const express = require('express');const methodOverride = require('method-override');const app = express();
// override with POST having ?_method=DELETEapp.use(methodOverride('_method'));Exemple d’appel avec surcharge de requête en utilisant HTML \<form>:
<form method="POST" action="/resource?_method=DELETE"> <button type="submit">Delete resource</button></form>prise en charge de plusieurs formats
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')); // IBMlogique personnalisée
Vous pouvez implémenter n’importe quel type de logique personnalisée avec une fonction pour le getter. Le
suivant implémente la logique de recherche dans req.body qui était dans 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; } }));Exemple d’appel avec surcharge de requête en utilisant 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>