Javascript 如何将Express.js变量传递给MongoDB函数?
我正在使用、和MongoDB开发一个(单击链接查看GitHub回购) 我为帖子做了一个简单的寻呼机 在控制器的帖子中,我有: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
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 %>">← Newer Posts</a>
</div>
<div class="px-1">
<a class="btn btn-primary <%= pageIncrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage + pageIncrement %>">Older Posts →</a>
</div>
</div>
<% } %>
<a class="btn btn-primary <%= pageDecrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage - pageDecrement %>">← 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 %>">← Newer Posts</a>
<a class="btn btn-primary <%= pageIncrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage + pageIncrement %>">Older Posts →</a>