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>
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>
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 methodOverride
bereitstellen, die auf der Projektseite aufgeführt ist.
benutzerdefinierte Logik
Sie können jede Art von benutzerdefinierter Logik mit einer Funktion für
getter
implementieren. Im Folgenden wird die Logik für das Durchsuchen vonreq.body
inmethod-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 } }))
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
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();
});