3

GET /teamチームのリストをロードし、DEL /teamからチームを削除するルートを含むページがあります/team/:key。そのため、チームのプロフィール ページに移動してそこから削除すると、削除時にその/teamページにリダイレクトされます。ログをコンソールに入れましたが、正常に削除されてteamおり、奇妙なことに、ロードしていると表示さ/teamれますが、ブラウザはこれをロードしません。コードを下に置きましたが、何かアイデアはありますか?

ルート:

  app.get('/team'/*, lim("Must be logged in to see teams")*/, getAllTeams, function(req, res){
    util.log('Serving request for url [GET] ' + req.route.path);
    // Pass it the list of all Teams
    res.render('team', {'teamsList' : req.teamsList} );
  });

  app.get('/team/:key', function(req, res) {
    util.log('Serving request for url [GET] ' + req.route.path);
    Team.findByKey(req.params.key, function(err, teamData){
      if(!err && teamData){
        teamData = teamData;
        res.render('teamDetails', { 'teamData' : teamData } );
      } else {
        util.log('Error in fetching Team by key : ' + req.params.key);
        res.json({
          'retStatus' : 'failure',
          'msg' : 'Error in fetching Team by key ' + req.params.key
        });
      }
    });
  });

  /**
    * DEL /team/:key
    * Delete Team by key
    */
  app.del('/team/:key', getAllTeams, function(req, res) {
    util.log('Serving request for url [DEL] ' + req.route.path);    
    Team.remove({key : req.params.key}, function(err){
      var message = '';
      var retStatus = '';
      if (!err) {
        util.log('Successfully deleting Team with key: ' + req.params.key);
        message = 'Successfully deleting Team with key: ' + req.params.key;
        retStatus = 'Success';
        res.redirect('/team');
      } else {
        util.log('Error deleting Team with key: ' + req.params.key + 'Error: ' + util.inspect(err));
        res.json({
          'retStatus' : 'failure',
          'msg' : 'Error in fetching Team with key ' + req.params.key
        });
      }
    });
  });

JavaScript + HTML テンプレート:

        button#teamDelete.btn.btn-danger.btn-mini(type="submit", value="Delete Team") Delete
        script(type='text/javascript')
            $('#teamDelete').live('click',function(){ 
                var teamId = #{teamData.key};
                $.post('/team/' + teamId, { _method : 'delete' }, function(response) {
                    console.log(response);
                    if(response.retStatus === 'Success') {
                        if('/team' && '/team' !== "") {
                            window.location = '/team';
                        }
                    }
                });
            });

コンソール ログ:

10 Mar 11:52:01 - Serving request for url [GET] /team
10 Mar 11:52:02 - Serving request for url [GET] /team/:key
10 Mar 11:52:03 - Serving request for url [DEL] /team/:key
10 Mar 11:52:03 - Successfully deleting Team with key: 1362855941128
10 Mar 11:52:03 - Serving request for url [GET] /team

getAllTeams:

var getAllTeams = function(req, res, next){
  Team.getAll(function(err, teamsList){
    if(!err && teamsList){
      req.teamsList = teamsList;
      return next();
    }
  });
};

Team.getAll (チーム スキーマ)

Team.statics.getAll = function(cb){
    var query = this.find({});
    query.sort({key : -1});
    return query.exec(cb);
  };
4

2 に答える 2

2

簡単な回避策として、リダイレクト URL を応答に追加し、クライアント側で次のようにします。

if (redirectUrl && redirectUrl !== "")
    window.location = redirectUrl;
于 2013-03-10T14:08:09.100 に答える
2

リクエストは POST ($.post) で、ルートは app.del であるため、app.del ルート内で res.redirect に到達することはありません。

なぜ app.post を使わないのですか?

更新しました:

ここで $.post が HTTP DEL リクエストを送信すると仮定すると、サーバーはデータなしで 302 レスポンスを送信しますが、ブラウザはサーバーの指示に従って GET ルートに別のリクエストを送信しません (または、jQuery はリダイレクトも処理しますか? わかりません)。res.redirect() は実際の HTTP 応答であり、ASP.NET で実行できるように要求を別のルートに再ルーティングするための内部サーバー側の命令ではありません (これは実際には間違っています)。ルートは要求を受信するように設計されています。応答で返信し、それを忘れてください。ルートを処理する実際の関数からルートを分離する必要があります。そうすれば、リダイレクトを送信する代わりにその関数を呼び出すことができます。

コードの提案

app.del('/team/:key' では ...

...
    retStatus = 'Success';
    // res.redirect('/team');
    res.send({
      retStatus : retStatus,
      redirectTo: '/team',
      msg : 'Just go there please' // this should help
    });
...

$.post('/team/' ... のクライアント側

...
    $.post('/team/' + teamId, { _method : 'delete' }, function(response) {
        console.log(response);
        if(response.retStatus === 'Success') {
            // not sure what did you mean by ('/team' && '/team' !== "")
            // if('/team' && '/team' !== "") {
            if (response.redirectTo && response.msg == 'Just go there please') {
                window.location = response.redirectTo;
            }
        }
    });
...

私はあなたが何をしているのか、getAllTeamsそしてなぜあなたteamListがreq. セッションに保存する場合は、ミドルウェアが正しく構成されていると仮定するよりも、req.session を使用する必要があります。リクエスト内でのみ保存する必要があり、getAllTeams がこのチームのリストを準備する場合は、res.locals (res.locals.teamList など) に保存することをお勧めします。次に getAllTeams が呼び出されることを確認します。したがって、基本的に getAllTeams は次のようになります。

function getAllTeams (req, res, next) {
    res.locals.teamList = [/* whatever */];
    next();
}

そして、req.teamList の代わりに、ルート ハンドラーで res.locals.teamList を使用できます。

res.render('team', {teamsList : res.locals.teamsList} );

また、「チーム」テンプレートにも問題がある可能性があります...

明示的なアドバイス:)

また、Express の使用方法によって、アプリケーションの拡張/管理が非常に難しくなります。正確な場所は覚えていませんが、ドキュメントのどこかに、Express はほとんどの PHP フレームワークのような完全なフレームワークとしてではなく、アプリケーション フレームワークの基盤として使用することになっていると書かれています。これにより、多くの機能と柔軟性が得られますが、アプリケーション アーキテクチャについて事前に十分に検討する必要もあります。

Express の最も強力な機能は、next() を介して相互に制御を渡す多くのルート固有のハンドラー/ミドルウェアによって任意のルートを処理できることです。各ルートで使用されるハンドラーを定義する静的テーブルがあり、1 ページで 30 ほどのルートを持つアプリケーション全体を表示できます。そして、このテーブルは、アプリケーションの起動時にルーティングを動的に組み立てるために使用されます。これにより、多くの柔軟性、管理性 (ルートからルートへハンドラーを移動/コピーして貼り付けることができます。各ハンドラーは 1 つの単語として表されます) とコードの再利用につながります。また、クライアント側のルーティングには、クライアントでルート定義の同じハッシュを使用します。

于 2013-03-10T17:53:44.367 に答える