middleware método de substituição
Permite que você use verbos HTTP como PUT ou DELETE em lugares onde o cliente não suporta.
Instale
Este é um módulo Node.js disponível através do
registro do npm. A instalação é feita usando o comando
npm install:
$ npm install method-overrideAPI
NOTA É muito importante que este módulo seja utilizado antes de qualquer módulo que
precise saber o método da solicitação (por exemplo, ela deve ser usada antes de
o módulo csurf).
methodOverride(getter, opções)
Crie uma nova função middleware para substituir a propriedade req.method com um novo valor
. Este valor será retirado do getter fornecido.
getter- O getter para usar para procurar o método de solicitação sobrescrito para a solicitação. (padrão:X-HTTP-Method-Override)options.methods- Os métodos permitidos que a solicitação original deve estar dentro para verificar se há um valor de substituição de método. (padrão:['POST'])
Se o método encontrado é suportado pelo núcleo node.js, então req. ethod será definido como
esse valor, como se tivesse sido originalmente esse valor. O valor anterior ‘req.method’
será armazenado em ‘req.originalMethod’ .
ganhador
Este é o método para obter o valor de substituição da solicitação. Se uma função é fornecida,
o req é passado como o primeiro argumento, o argumento ‘res’ como o segundo argumento e o método é
esperado para ser retornado. Se uma string for fornecida, a string é usada para procurar o método
com as seguintes regras:
- Se a string começa com
X-, então é tratado como o nome de um cabeçalho e o cabeçalho é usado para a substituição de método. Se a solicitação contiver o mesmo cabeçalho múltiplas vezes, a primeira ocorrência é usada. - Todas as outras frases são tratadas como uma chave na string de consulta de URL.
opções.métodos
Isso permite a especificação de quais métodos(s) a requisição MUST estar a fim de verificar se
o valor de substituição do método. Este padrão é apenas o método POST, que é o único método em que a substituição
deve chegar. Mais métodos podem ser especificados aqui, mas isso pode introduzir problemas de segurança
e causar comportamento estranho quando requisitados viajam através de caches. Este valor é um array
dos métodos em maiúsculas. null pode ser especificado para permitir todos os métodos.
Exemplos
sobrepor usando um cabeçalho
Para usar um cabeçalho para substituir o método, especifique o nome do cabeçalho
como um argumento string para a função methodOverride. To then make
the call, send a POST request to a URL with the overridden method
as the value of that header. Este método de usar um cabeçalho
normalmente seria usado em conjunto com XMLHttpRequest em implementações
que não suportam o método que você está tentando 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'));Exemplo de chamada com substituição de cabeçalho 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);}substituir usando um valor de consulta
Para usar um valor da string de consulta para substituir o método, especifique a chave de consulta
string como um argumento de string para a função methodOverride. Para
então faça a chamada, enviar uma solicitação POST para uma URL com o método
sobrescrito como o valor da chave da string de consulta. Este método de usar um valor
de consulta seria normalmente usado em conjunto com elementos HTML
\<form> ao tentar apoiar navegadores legados, mas ainda usar
métodos mais recentes.
const express = require('express');const methodOverride = require('method-override');const app = express();
// override with POST having ?_method=DELETEapp.use(methodOverride('_method'));Exemplo de chamada com substituição de consulta usando HTML \<form>:
<form method="POST" action="/resource?_method=DELETE"> <button type="submit">Delete resource</button></form>suporte a múltiplos 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
Você pode implementar qualquer tipo de lógica personalizada com uma função para o getter. A seguir
implementa a lógica para procurar em req.body que estava em 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; } }));Exemplo de chamada com substituição 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>