Node.js - Экспресс 4.x - метод-переопределение без обработки запроса PUT
Я пытаюсь передать серверу запрос PUT. Но безрезультатно. Клиент отправляет сообщение "Can not POST/" после отправки формы. Я использую Express 4.x.
Обратите внимание, что если я изменил "put" на "post" на моем маршруте, запрос обрабатывается просто отлично...
Как я могу обработать мой сервер с запросом "PUT"?
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.");
КЛИЕНТ
<!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>
Ответы
Ответ 1
Простым способом может быть переопределить значение запроса:
var methodOverride = require('method-override')
// override with POST having ?_method=PUT
app.use(methodOverride('_method'))
Пример вызова с переопределением запроса с помощью HTML:
<form method="POST" action="/resource?_method=PUT">
<button type="submit">Put resource</button>
</form>
Ответ 2
От метод-переопределить v2.0.0 (выпуск 2014-06-01), поведение по умолчанию промежуточного программного обеспечения не проверяет тело POST для _method
поле; он проверяет заголовок X-HTTP-Method-Override
.
Для того, чтобы метод-переопределение работал так же, как в предыдущих версиях, вам необходимо предоставить настраиваемую функцию methodOverride
, которая подробно описана на странице страницы проекта:
пользовательская логика
Вы можете реализовать любую специальную логику с функцией для getter
. Следующее реализует логику для поиска в req.body
, которая находилась в 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
}
}))
Ответ 3
Вы можете выбрать способ переопределения:
// 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
Ответ 4
Мы могли бы также использовать простое промежуточное программное обеспечение для обработки 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();
});