わかりましたので、簡単なnode.js/express.js/mongodbアプリをここに設定し、次のように構成します。
var express = require('express'),
mongoose = require('mongoose');
http = require('http');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
//middleware stack
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + "/public"));
});
mongoose.connect("mongodb://localhost/hello");
問題は、PUTまたはDELETEリクエストを実行しようとしたときです。私の形はこのシンプルです
<form method="POST" action="/users/#{user.name}">
<input type="hidden" name="_method" value="PUT"/>
</form>
今私のルーターは、ルートをExpress .put()メソッドでキャッチします
app.put('/users/:name', function(req, res) {
var b = req.body;
Users.update(
{ name: req.user.name },
{ name: b.name, age: b.age, email: b.email },
function(err) {
res.redirect('/users/'+b.name);
});
})
リクエストを行うと、「Cannot PUT」または「Cannot DELETE」エラーが発生します。
Chomes RESTfulクライアントを介して同じリクエストを実行しようとしましたが、結果は同じです。
私は同じ問題が魔女にあるというトピックを読みましたが、コメントに従っても答えは私の問題を解決しませんでした。
私が調べた質問 methodoverrideを使用せずにメソッドの削除と配置を行うExpressjsのサポート
PUT、DELETE、HEADなどのメソッドは、ほとんどのWebブラウザーで使用できますか?
他のいくつかと一緒に。また、express.jsとmongoのドキュメントを何度か参照しました。私は何がうまくいかないのか考えられません。
どんな助けでもありがたいです。
更新
Jonathan Lonowskiが指摘したように、PUT
も使用できるため、私の古い答えは無視できます。取得 Cannot PUT
またはCannot POST
エラーは、コールバックが正常に実行されていないことを意味します。私の推測はUsers.update
が失敗しているため、POSTまたはPUTできません。確認できますか?.
古い答え
この行を変更してみてください
app.put('/users/:name', function(req, res) {
に
app.post('/users/:name', function(req, res) {
フォームを送信しようとしているため
ビューにリストした<form>
または__dirname + "/public"
の下のstatic
ファイルはありますか?
静的ファイル内では、#{user.name}
はおそらくuser
のname
に置き換えられておらず、 RL Fragment として扱われます。
path
であるため、<form>
は実際には/users/
ではなく/users/:name
に送信されます。
console.log(url.parse('/users/#{user.name}'));
{ hash: '#{user.name}',
pathname: '/users/',
path: '/users/',
href: '/users/#{user.name}' }
action
は動的でデータ駆動型である必要があるため、そうでない場合は<form>
をビューから生成する必要があります。 Jadeでは、user
がlocals
のメンバーであると想定すると、次のようになります。
form(method='POST', action='/users/' + user.name)
input(type='hidden', name='_method', value='PUT')
使用するメソッドがオーバーライドする場合は、ルートを使用する前に宣言していることを確認してください。それが私が抱えていた問題でした。
奇妙な魔法が働いていない限り、フォームはPOSTリクエストであり、PUTではありません。PUTが必要な場合は、 jQuery.ajax
関数を使用してtype: 'PUT'
パラメータ( this answer など)は、フォームハンドラから、 jQuery.submit
を参照してください。フォームが2回送信されないように、return false
を忘れないでください。
app.post( "/ movies /:id")は1つの解決策です。それでもapp.put( "/ movies /:id")を使用したい場合は、これを試してください:
フォームに次の属性があることを確認してください。
action = "/ movies/<%= movies._id%>?_ method = PUT" method = "POST">
これらの2つの解決策は私のために働いた。 RESTをフォローしている場合は、メソッドovverideを使用します。それ以外の場合はapp.post()でもうまくいきます。
1つの解決策は、corsミドルウェアを使用することですPUT、PATCHおよびDELETEこのようなapp.jsファイルで次のようなリクエストを送信します。
最初にcorsパッケージをnpm経由でインストールします。
npm i cors
次に、次のコードをapp.jsに追加します。
const cors = require('cors')
app.use(cors())
res.redirect('path')
をres.redirect(303, 'path')
に変更します
Put
およびDelete
で、get
アドレスにリダイレクトする場合は、最初のパラメーターとして303を渡す必要があります。( ソース )