javascript - nodejs - Node.js-Express 4.x-anulación de método que no maneja la solicitud PUT
url parse js (4)
A partir del método-override v2.0.0 (versión 2014-06-01), el comportamiento predeterminado del middleware no comprueba el cuerpo de la POST para un campo _method
; solo verifica el encabezado X-HTTP-Method-Override
.
Para que la anulación de métodos funcione como lo hizo en versiones anteriores, debe proporcionar una función personalizada a methodOverride
, que se detalla en la página del proyecto :
lógica personalizada
Puede implementar cualquier tipo de lógica personalizada con una función para el
getter
. Lo siguiente implementa la lógica para buscar enreq.body
que estaba en elmethod-override
1:
var bodyParser = require(''body-parser'') var connect = require(''connect'') var methodOverride = require(''method-override'') 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 var method = req.body._method delete req.body._method return method } }))
Estoy intentando que el servidor maneje una solicitud PUT. Pero fue en vano. El cliente sigue recibiendo el mensaje "No se puede enviar / POST /" después de enviar el formulario. Estoy usando Express 4.x.
Tenga en cuenta que si cambio "poner" a "publicar" en mi ruta, la solicitud se maneja bien ...
¿Cómo puedo hacer que mi servidor maneje la solicitud ''PUT''?
SERVIDOR:
var express = require("express");
var bodyParser = require("body-parser");
var methodOverride = require("method-override");
var app = express();
app.use(bodyParser());
app.use(methodOverride());
app.get("/",function(req,res){
res.render("index.ejs");
console.log("GET received.");
});
app.put("/",function(req,res){
console.log("PUT received: " + req.body.userName + " - " + req.body.password);
});
app.listen(1337);
console.log("Listening on 1337.");
CLIENTE
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
</head>
<body>
<form action="/" method="post">
First
<input type="text" name="first">
Last
<input type="text" name="last">
<input type="hidden" name="_method" value="put">
<button type="submit">Submit</button>
</form>
</body>
</html>
Puede elegir cómo anular:
// override with different headers; last one takes precedence
app.use(methodOverride(''X-HTTP-Method'')) // Microsoft
app.use(methodOverride(''X-HTTP-Method-Override'')) // Google/GData
app.use(methodOverride(''X-Method-Override'')) // IBM
Se podría anular una forma más simple utilizando un valor de consulta :
var methodOverride = require(''method-override'')
// override with POST having ?_method=PUT
app.use(methodOverride(''_method''))
Ejemplo de llamada con anulación de consulta usando HTML:
<form method="POST" action="/resource?_method=PUT">
<button type="submit">Put resource</button>
</form>
También podríamos usar un middleware simple para manejar x-http-method-override
var router = express.Router();
/**
* Middleware that detects a HTTP method tunneled,
* inside the header of another HTTP method. Detects
* and routs to the method mentioned in the header.
*/
router.use((req,resp,next)=>{
if(req.headers[''x-http-method-override'']){
req.method = req.headers[''x-http-method-override''];
}
next();
});