2016-06-25 15 views
0

私のフィードがインデックスルートパス/で表示され、その後追加のページが/feed/:pageNumberでアクセスされるページング設定があります。次のレコードと前のレコードのページネーションには問題はありませんが、最後のpreviousPageでこの機能を使用したい場合は、/のパスにリダイレクトしてください。これは最新のレコードがあるためです。 else文でres.redirect( '/')を使用しようとしましたが、エラーError: Can't set headers after they are sent.が発生します。最後のpreviousPageクリックで家にリダイレクトする方が良いでしょうか?Expressjsページネーションのリダイレクト

E.x.ユーザーは「/」をクリックし、「次へ」をクリックして「/フィード/ 2」に送信します。ユーザーが「前」をクリックすると、「/」に戻されます。それらが/ feed/3,4,5、etc /にある場合、ユーザは現在のパラメータ値よりも1つ少ない値になります。

セクションは私が修正しようとしている:

if(req.params.pageNumber > 2){ 
        res.locals.previous = true; 
        res.locals.previousPage = req.params.pageNumber - 1; 
       } else { 
        res.locals.previous = true; 
        res.locals.previous = res.redirect('/'); 
       } 

ビュー:

<!DOCTYPE html> 
<head> 
    {{> app/app-head}} 
</head> 
<body> 
    {{> app/app-navigation}} 

    <div class="container"> 
     <h1 class="page-title-header">Activity Feed</h1> 
      {{> app/card}} 
    </div> 
    {{#if previous}} 
    <a href="/feed/{{previousPage}}">Previous Page</a> 
    {{/if}} 
    {{#if secondPage}} 
    <a href="/feed/{{secondPage}}">Next Page</a> 
    {{/if}} 
    {{#if next}} 
    <a href="/feed/{{nextPage}}">Third Page</a> 
    {{/if}} 
</body> 

ルート:

/*==== /====*/ 

appRoutes.route('/') 

    .get(function(req, res){ 

     models.Card.findAll({ 
      order: 'cardDate DESC', 
      include: [{ 
       model: models.User, 
       where: { organizationId: req.user.organizationId }, 
       attributes: ['organizationId', 'userId'] 
      }], 
      limit: 10 
     }).then(function(card){ 

      function feedLength(count){ 
       if (count >= 10){ 
        return 2; 
       } else { 
        return null; 
       } 
      }; 

      res.render('pages/app/high-level-activity-feed.hbs',{ 
       card: card, 
       user: req.user, 
       secondPage: feedLength(card.length) 
      }); 
     }); 
    }) 

    .post(function(req, res){ 
     models.Card.create({ 
      card: req.body.cardDate, 
      userId: req.user.userId 
     }).then(function() { 
      res.redirect('/app'); 
     }).catch(function(error){ 
      res.send(error); 
     }) 
    }); 

appRoutes.route('/feed/:pageNumber') 

    .get(function(req, res){ 

     function paginationPage(count){ 
      if(count == 2){ 
       return 10; 
      } else { 
       return (count - 1) * 10; 
      } 
     }; 
     var skip = parseInt(req.params.pageNumber); 

     models.Card.findAll({ 
      order: 'cardDate DESC', 
      include: [{ 
       model: models.User, 
       where: { organizationId: req.user.organizationId }, 
       attributes: ['organizationId', 'userId'] 
      }], 
      offset: paginationPage(skip), 
      limit: 10 
     }).then(function(annotation){ 
       if(annotation.length == 10){ 

        res.locals.next = true; 
        res.locals.nextPage = parseInt(req.params.pageNumber) + 1; 
        console.log('This is the next page pagination: ' + res.locals.nextPage); 
       } 

       if(req.params.pageNumber > 2){ 
        res.locals.previous = true; 
        res.locals.previousPage = req.params.pageNumber - 1; 
       } else { 
        res.locals.previous = true; 
        res.locals.previous = res.redirect('/'); 
       } 
      res.render('pages/app/high-level-activity-feed.hbs',{ 
       card: card, 
       user: req.user 
      }); 
     }); 
    }) 

答えて

1

問題が二つある:

  • テンプレートは、常に/feed/前のページリンク接頭辞:

    <a href="/feed/{{previousPage}}">Previous Page</a> 
    
  • res.redirect('/')があなたExpressのサーバー内から実際リダイレクトを実行する(それはリンク、またはクライアント側のJavaScriptを生成しません)

可能な解決策は、あなたのテンプレートに第3の状態を追加することです:

{{#if backHome}} 
<a href="/">Previous Page</a> 
{{/if}} 

そして、あなたのサーバーのコードで:

if (req.params.pageNumber > 2) { 
    res.locals.previous = true; 
    res.locals.previousPage = req.params.pageNumber - 1; 
} else { 
    res.locals.backHome = true; 
} 
+0

働きました!ヘルプと説明のために@robertklepに感謝します。 – cphill