サーバーに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>
より簡単な方法は次のようになります クエリ値を使用してオーバーライド :
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>
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 } }))
_
単純なミドルウェアを使用して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();
});
最初の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)
が実行されます
オーバーライドする方法を選択できます。
// 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