web-dev-qa-db-ja.com

Node.js-Express4.x-メソッド-PUTリクエストを処理しないオーバーライド

サーバーにPUTリクエストを処理させようとしています。しかし、役に立たない。フォームを送信した後、クライアントは「Cannot POST /」」メッセージを受信し続けます。Express 4.xを使用しています。

ルートで「put」を「post」に変更すると、リクエストは正常に処理されることに注意してください...

サーバーに「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.");

[〜#〜] client [〜#〜]

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

method-override v2.0. (release 2014-06-01)の時点で、ミドルウェアのデフォルトの動作は、POST body for __method_フィールド; _X-HTTP-Method-Override_ヘッダーのみをチェックします。

メソッドオーバーライドを以前のバージョンと同じように動作させるには、カスタム関数をmethodOverrideに提供する必要があります。これについては、 プロジェクトページ で詳しく説明しています。

カスタムロジック

getterの関数を使用して、あらゆる種類のカスタムロジックを実装できます。以下は、_req.body_ 1にあった_method-override_を検索するためのロジックを実装しています。

_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

単純なミドルウェアを使用して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();
    });
1
Suhail Gupta

最初のexpressプロジェクトのビルドを開始したばかりで、次のコードが機能します。 Laravelから来たので、ルートで__method_フィールドの存在を確認し、適切なルートを決定する必要がありました。そこで、これを行うためのミドルウェアを作成しました。

_import { RequestHandler } from "express";

// Updates the request method if there is a 
// "_method" field present in the request query or
// request body.
const methodOverride: RequestHandler = function (req, res, next) {

    // Set the request method to the "_method" value in query
    // or the request body. Perform a validation before setting the
    // request method.
    req.method = req.query._method || req.body._method || req.method;

    // Carry forward the request to next middleware
    return next();
};

export default methodOverride;
_

ルート関連のミドルウェアの前に、このミドルウェアを使用してください。そして今、私のフォームは次のようになります

_<form action="/" method="post">
    <input type="text" name="first">
    <input type="text" name="last">
    <input type="hidden" name="_method" value="put">
    <button type="submit">Submit</button>
</form>
_

router.put('/', handler)の代わりにrouter.post('/', handler)が実行されます

0

オーバーライドする方法を選択できます。

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