it-roy-ru.com

Node.js - Express 4.x - переопределение метода не обрабатывает запрос PUT

Я пытаюсь, чтобы сервер обработал запрос PUT. Но безрезультатно. Клиент продолжает получать сообщение «Cannot POST /» после отправки формы. Я использую Express 4.x.  

Обратите внимание, что если я изменю «положить» на «пост» в моем маршруте, запрос будет обработан очень хорошо ...

Как я могу сделать так, чтобы мой сервер обрабатывал запрос PUT?

СЕРВЕР:

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

Более простым способом может быть переопределить, используя значение запроса :

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>
17
maxcnunes

Начиная с method-override 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
  }
}))
12
Tim Cooper

Вы можете выбрать, как переопределить:

// 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

Мы также могли бы использовать простое промежуточное программное обеспечение для обработки 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();
    });
0
Suhail Gupta