web-dev-qa-db-ja.com

ExpressはメソッドをPUT / DELETEできません。何が問題になっていますか?

わかりましたので、簡単な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のドキュメントを何度か参照しました。私は何がうまくいかないのか考えられません。

どんな助けでもありがたいです。

15
Daniel Tate

更新

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) {

フォームを送信しようとしているため

10
user568109

ビューにリストした<form>または__dirname + "/public"の下のstaticファイルはありますか?

静的ファイル内では、#{user.name}はおそらくusernameに置き換えられておらず、 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では、userlocalsのメンバーであると想定すると、次のようになります。

form(method='POST', action='/users/' + user.name)
  input(type='hidden', name='_method', value='PUT')
3

使用するメソッドがオーバーライドする場合は、ルートを使用する前に宣言していることを確認してください。それが私が抱えていた問題でした。

1

奇妙な魔法が働いていない限り、フォームはPOSTリクエストであり、PUTで​​はありません。PUTが必要な場合は、 jQuery.ajax 関数を使用してtype: 'PUT'パラメータ( this answer など)は、フォームハンドラから、 jQuery.submit を参照してください。フォームが2回送信されないように、return falseを忘れないでください。

1
Dan Ross

app.post( "/ movies /:id")は1つの解決策です。それでもapp.put( "/ movies /:id")を使用したい場合は、これを試してください:

  1. Npmからmethod-ovverideをインストールします。
  2. App.jsファイルで必須です。
  3. PUTリクエストを呼び出す場所からフォームを開きます
  4. フォームに次の属性があることを確認してください。

    action = "/ movies/<%= movies._id%>?_ method = PUT" method = "POST">

これらの2つの解決策は私のために働いた。 RESTをフォローしている場合は、メソッドovverideを使用します。それ以外の場合はapp.post()でもうまくいきます。

0
Usama

1つの解決策は、corsミドルウェアを使用することですPUT、PATCHおよびDELETEこのようなapp.jsファイルで次のようなリクエストを送信します。

最初にcorsパッケージをnpm経由でインストールします。

npm i cors

次に、次のコードをapp.jsに追加します。

const cors = require('cors')

app.use(cors())
0
Soheil Rezae

res.redirect('path')res.redirect(303, 'path')に変更します

PutおよびDeleteで、getアドレスにリダイレクトする場合は、最初のパラメーターとして303を渡す必要があります。ソース

0
yaya