wake-up-neo.net

Node.js - Express 4.x - Überschreiben der Methode ohne Behandlung der PUT-Anforderung

Ich versuche, dass der Server eine PUT-Anforderung verarbeitet. Aber ohne Erfolg. Der Client erhält nach dem Senden des Formulars weiterhin die Meldung "Kann nicht POST /". Ich benutze Express 4.x.

Wenn ich auf meiner Route "put" in "post" ändere, wird die Anfrage gut verarbeitet ...

Wie kann ich meinen Server die 'PUT'-Anfrage bearbeiten lassen?

SERVER:

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.");

KLIENT

<!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>
16
flukyspore

Ein einfacherer Weg könnte sein: Überschreiben mit einem Abfragewert :

var methodOverride = require('method-override')

// override with POST having ?_method=PUT
app.use(methodOverride('_method'))

Beispielaufruf mit Abfrageüberschreibung mithilfe von HTML:

<form method="POST" action="/resource?_method=PUT">
  <button type="submit">Put resource</button>
</form>
17
maxcnunes

Ab method-override v2.0.0 (Release 2014-06-01) prüft das Standardverhalten der Middleware nicht den POST body für ein _method-Feld. es überprüft nur den X-HTTP-Method-Override-Header.

Damit das Überschreiben der Methode wie in früheren Versionen funktioniert, müssen Sie eine benutzerdefinierte Funktion für methodOverridebereitstellen, die auf der Projektseite aufgeführt ist.

benutzerdefinierte Logik

Sie können jede Art von benutzerdefinierter Logik mit einer Funktion für getterimplementieren. Im Folgenden wird die Logik für das Durchsuchen von req.body in method-override 1 implementiert:

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
  }
}))
12
Tim Cooper

Sie können auswählen, wie Sie überschreiben möchten:

// 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
0
Leandro Latorre

Wir könnten auch eine einfache Middleware verwenden, um x-http-method-override zu handhaben.

     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();
    });
0
Suhail Gupta