parse nodejs node javascript node.js express connect

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 en req.body que estaba en el method-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(); });