web-dev-qa-db-ja.com

Express.js変数をMongoDB関数に渡すにはどうすればよいですか?

私はブログアプリケーションに取り組んでいます(リンクをクリックしてGitHubrepo) Express[〜#〜] ejs [〜#〜] およびMongoDBを使用します。

投稿用のシンプルなポケットベルを作成しました。

記事ではcontroller私が持っています:

_exports.getPosts = async (req, res, next) => {

  const posts = await Post.find({}, (err, posts) => {

      const perPage = 10;

      const currPage = req.query.page ? parseInt(req.query.page) : 1;

      const postsCount = posts.length;

      const pageCount = Math.ceil(postsCount / perPage);

      const pageDecrement = currPage > 1 ? 1 : 0;

      const pageIncrement = currPage < pageCount ? 1 : 0;

      if (err) {
        console.log("Error: ", err);
      } else {
        res.render("default/index", {
          moment: moment,
          layout: "default/layout",
          website_name: "MEAN Blog",
          page_heading: "XPress News",
          page_subheading: "A MEAN Stack Blogging Application",
          currPage: currPage,
          pageDecrement: pageDecrement,
          pageIncrement: pageIncrement,
          posts: posts,
        });
      }
    })
      .sort({ created_at: -1 })
      .populate("category")
      .limit(perPage)
      .skip((currPage - 1) * perPage);
};
_

ビューのポケットベル:

_<% if (posts) {%>
  <div class="clearfix d-flex justify-content-center">
    <div class="px-1">
        <a class="btn btn-primary <%= pageDecrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage - pageDecrement %>">&larr; Newer Posts</a>
    </div>

    <div class="px-1">
        <a class="btn btn-primary <%= pageIncrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage + pageIncrement %>">Older Posts &rarr;</a>
    </div>
  </div>
<% } %>
_

問題

コントローラーからの行.limit(perPage)は、コンソール(Git bash)でエラー_perPage is not defined_を示します。

機能しないソリューション

明らかに、これらの2行を_const posts_の上に移動できます

_const perPage = 5;
const currPage = req.query.page ? parseInt(req.query.page) : 1;
_

できません_const postsCount = posts.length;_(ビューでも必要です)と同じことができます.

目的

ページネーションに関するコードのスニペットreusableを作成しようとしています(可能な場合はプラグインのように)。カテゴリ、およびアプリケーションの管理セクションにある投稿のリスト。

何が悪いのですか?

3
Razvan Zamfir

他のコメントで説明したように。これはスコープの問題である可能性があります。

exports.getPosts = async (req, res, next) => {
  const perPage = 10; // enable you to use perPage inside getPosts()
  let postsCount = 0; // let, to enable you to use/reassigned postsCount inside getPosts()
  const posts = await Post.find({}, (err, posts) => {
    // ...
    postsCount = posts.length; // updates the variable with the correct count
    // ...
    if (err) {
        console.log("Error: ", err);
      } else {
        res.render("default/index", {
          //...
          posts: posts,
          postsCount: posts.length, // for explicit postsCount in the view

        });
      }

  });

  // ..


あなたのビューには既にpostsがあるので、ビューのpostsCountに問題があります

<% if (posts) {%>
  ...
<% } %>

posts.lengthまたはpostsCountsは、他のユーザーの使用方法(たとえば、pageIncrement、currPage、pageIncrement);のようなビューで使用します。

1
Harold Pogi

多分このコンポーネントをチェックすれば、それがどのように機能するかを見ることによってあなたの問題を解決することができます

マングースページネーション

$ npm install mongoose-paginate

/**
* querying for `all` {} items in `MyModel`
* paginating by second page, 10 items per page (10 results, page 2)
**/

MyModel.paginate({}, 2, 10, function(error, pageCount, paginatedResults) {
 if (error) {
   console.error(error);
 } else {
   console.log('Pages:', pageCount);
   console.log(paginatedResults);
 }
}
1
Daniel Cabrera

私が最近気付いたように、_postsCount = posts.length_は投稿をカウントしますafter.skip((currPage - 1) * perPage)によって制限されるため、pageIncrement変数の「式」は次のようになります。

_let pageIncrement = postsCount >= perPage ? 1 : 0;
_

だから私はコントローラで得ます:

_exports.getPosts = async (req, res, next) => {

    const perPage = 5;

    const currPage = req.query.page ? parseInt(req.query.page) : 1;

    let postsCount = 0;

    const posts = await Post.find({}, (err, posts) => {

            postsCount = posts.length;

            let pageDecrement = currPage > 1 ? 1 : 0;

            let pageIncrement = postsCount >= perPage ? 1 : 0;

            if (err) {
                console.log('Error: ', err);
            } else {
                res.render('default/index', {
                    moment: moment,
                    layout: 'default/layout',
                    website_name: 'MEAN Blog',
                    page_heading: 'XPress News',
                    page_subheading: 'A MEAN Stack Blogging Application',
                    currPage: currPage,
                    posts: posts,
                    pageDecrement: pageDecrement,
                    pageIncrement: pageIncrement
                });
            }
        })
        .sort({
            created_at: -1
        })
        .populate('category')
        .limit(perPage)
        .skip((currPage - 1) * perPage);
};
_

そしてビューでは:

_<a class="btn btn-primary <%= pageDecrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage - pageDecrement %>">&larr; Newer Posts</a>
_

そして

_<a class="btn btn-primary <%= pageIncrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage + pageIncrement %>">Older Posts &rarr;</a>
_

_perPage x N_に等しい数の投稿がない限り、これはうまく機能します。Nは整数です。この場合、[古い投稿]ボタンが1ページ遅れて無効になります。

0
Razvan Zamfir