18

わかりましたので、次のように構成を使用して、単純な 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>

これで、ルーターはエクスプレス .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クライアントを介してこれと同じリクエストを作成しようとしました。

コメントをたどっても問題は解決しませんでしたが、魔女が私と同じ問題を抱えているトピックを読みました。

メソッドdeleteおよびmethodoverrideなしのputのexpressjsサポートについて調べた質問

PUT、DELETE、HEAD などのメソッドは、ほとんどの Web ブラウザーで使用できますか?

他のいくつかと一緒に。また、express.js と mongo のドキュメントも何度か参照しました。何がうまくいかないのか考えられません。

どんな助けでも大歓迎です。

4

7 に答える 7

13

アップデート

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

フォームを送信しようとしているので

于 2013-03-04T04:05:51.853 に答える
3

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

静的ファイル内では、 は#{user.name}おそらく に置き換えられず、 URL Fragmentとして扱われuserます。name

それが であるため、は実際には ではなく<form>に送信されます。/users//users/:namepath

console.log(url.parse('/users/#{user.name}'));

{ hash: '#{user.name}',
  pathname: '/users/',
  path: '/users/',
  href: '/users/#{user.name}' }

は動的でデータ駆動型で<form>ある必要があるため、そうでない場合はビューから生成する必要があります。actionJade を使用しuser、 が のメンバーであると仮定すると、次のlocalsようになります。

form(method='POST', action='/users/' + user.name)
  input(type='hidden', name='_method', value='PUT')
于 2013-03-04T04:06:22.820 に答える
1

奇妙な魔法が働いていない限り、フォームは PUT ではなく POST リクエストを作成します。PUTしたい場合は、この回答のように、フォームハンドラーからパラメーターを指定してjQuery.ajax関数を使用することをお勧めします。フォームが 2 回送信されないようにすることを忘れないでください。type: 'PUT'jQuery.submitreturn false

于 2013-03-04T04:27:12.023 に答える
1

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

于 2018-09-22T21:13:58.407 に答える