Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将Express.js变量传递给MongoDB函数?_Javascript_Node.js_Express_Ejs_Mean Stack - Fatal编程技术网

Javascript 如何将Express.js变量传递给MongoDB函数?

Javascript 如何将Express.js变量传递给MongoDB函数?,javascript,node.js,express,ejs,mean-stack,Javascript,Node.js,Express,Ejs,Mean Stack,我正在使用、和MongoDB开发一个(单击链接查看GitHub回购) 我为帖子做了一个简单的寻呼机 在控制器的帖子中,我有: exports.getPosts = async (req, res, next) => { const posts = await Post.find({}, (err, posts) => { const perPage = 10; const currPage = req.query.page ? parseInt(re

我正在使用、和MongoDB开发一个(单击链接查看GitHub回购)

我为帖子做了一个简单的寻呼机

在控制器的帖子中,我有:

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);
};
但是我可以
const postsunt=posts.length做同样的操作(我在视图中也需要它)

目标 我试图使分页的代码片段可重用(如有可能,像插件一样),因为我需要为按类别筛选的帖子以及应用程序管理部分中的帖子列表分页


我做错了什么?

正如评论正确指出的那样,这似乎是一个范围界定问题

exports.getPosts=async(req、res、next)=>{
//getPosts本地范围
const posts=wait Post.find({},(err,posts)=>{
//…局部范围
每页常数=10;
const currPage=req.query.page?parseInt(req.query.page):1;
const postscont=posts.length;
const pageCount=Math.ceil(PostScont/perPage);
常量页减量=当前页>1?1:0;
const pageIncrement=currPage
const perPage
移动到
const posts
上方,它将在正确的范围/上下文中

exports.getPosts=async(req、res、next)=>{
每页常数=10;
//getPosts本地范围
const posts=wait Post.find({},(err,posts)=>{
//…func的其余部分
});
//…func的其余部分
};

如果您检查此组件,您可以通过查看其工作原理来解决问题


正如其他评论所解释的那样。这可能只是范围的问题

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

        });
      }

  });

  // ..


对于视图中的PostScont问题,因为您在视图中已经有
posts

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

...

我认为您可以在视图中使用
posts.length
postsCounts
,就像您使用其他内容一样(例如pageIncrement、currPage、pageIncrement)

为什么要同时使用callback和await。似乎您需要查看async/await和promises。您可以执行以下操作:

exports.getPosts = async (req, res, next) => {
  const currPage = req.query.page ? parseInt(req.query.page) : 1;
  const perPage = 10;
  try {
    const posts = await Post.find({})
      .sort({ created_at: -1 })
      .populate("category")
      .limit(perPage)
      .skip((currPage - 1) * perPage).exec();

    const postsCount = posts.length;

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

    const pageDecrement = currPage > 1 ? 1 : 0;

    const pageIncrement = currPage < pageCount ? 1 : 0;
    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,
    });
  } catch (err) {
    console.log("Error: ", err);
    // add proper error handling here 
    res.render('default/error', {
      err
    });
  }
};
exports.getPosts=async(req、res、next)=>{
const currPage=req.query.page?parseInt(req.query.page):1;
每页常数=10;
试一试{
const posts=wait Post.find({})
.sort({created_at:-1})
.填充(“类别”)
.限额(每页)
.skip((当前页-1)*每页).exec();
const postscont=posts.length;
const pageCount=Math.ceil(PostScont/perPage);
常量页减量=当前页>1?1:0;
const pageIncrement=currPage
正如我最近发现的
postsCount=posts.length
对受
限制的帖子进行计数。skip((currPage-1)*每页)
,因此
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);
};
并且认为:

<% 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>
<% } %>
<a class="btn btn-primary <%= pageDecrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage - pageDecrement %>">&larr; Newer Posts</a>



除非每页有相当于
的帖子数量x N
,其中N是一个整数,在这种情况下,“旧帖子”按钮被禁用一页太晚了

我没有运行代码,但我认为
perPage
变量是正确的范围。在
const posts
之前尝试定义它。检查这些答案,它们可以帮助您解决一个问题,但会留下/创建其他问题:我有一个
postsunt
变量,它使用
posts
变量。您可以使用局部范围引用外部范围,但不能反过来引用。本文可以比我更好地解释这一点:我已经做到了,使用
var postsCount=0,因为我无法更改常量的值。您好@harold pogi,欢迎使用SO!下一次,请确保不只是发布代码,而是解释为什么这个解决方案可能会工作,什么是错误的。这很有帮助!虽然这段代码可能会解决OP的问题,但最好包括关于代码如何解决OP问题的解释。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以编辑以添加其他信息和/或使用源文档补充说明。谢谢。我已经更新了我的答案,还包括解释和添加了
postsCount
我认为您的
Post.find()
缺少
err
posts
参数。如果您使用async wait,则无需传递回调
U
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>