Я больше начинающий.У меня есть шаблон заголовка ejs, который имеет боковую панель переключения, которая отображает пару постов в блоге с наибольшим количеством просмотров и пару последних (новейших) постов в блоге (node mongoose express, btw).
Мой код работает и все, я просто хочу знать, есть ли лучшее решение, чем это.Потому что я должен включить (и изменить!) Весь код почти на каждом маршруте, потому что сообщения блога находятся в шаблоне заголовка (не только там, конечно).
router.get("/", function(req, res){
Blog.find({}, function(err, recentBlogs){
if(err){
console.log(err);
} else{
Blog.find({}, function(err, viewsBlogs){
if(err){
console.log(err);
} else{
res.render("index", {blogsR: recentBlogs, ... });
}
}).sort({ views: 'desc' });
}
}).sort({ createdAt: 'desc' });
});
Могу ли я сделать вышекороче код или сделать из него функцию, и при этом иметь возможность включать больше вещей, например,
{момент: момент}
, не имея этого в функции?я могу передать страницу («индекс») в функцию успешно, но не знаю, как передать другие вещи, особенно когда неизвестно, сколько дополнительных данных я хочу визуализировать.Это, как говорится, мне не нравится мой код там и спрашиваю это по образовательным причинам.спасибо за любую помощь!
РЕДАКТИРОВАТЬ: вот 3 примера кода.первый, который я могу включить в большинство моих маршрутов в качестве рабочей функции, что приятно.Есть некоторые особые случаи, но я не знаю, как передать, например, {blog: foundBlog} в функцию.и вообще, я чувствую, что 2-й код не лучшая практика, я хотел бы получить общую справку о том, как сократить его и сделать его более похожим на профи.
функция:
// Получить все блоги из БД
function showBlogs(req, res, search, page){
Blog.find(search, function(err, recentBlogs){
if(err){
console.log(err);
} else{
Blog.find({}, function(err, viewsBlogs){
if(err){
console.log(err);
} else{
res.render(page, {moment: moment, blogsR: recentBlogs, blogsV: viewsBlogs, currentUser: req.user});
}
}).sort({ views: 'desc' });
}
}).sort({ createdAt: 'desc' });
}
особый случай 1 (отправить данные блога, отослать все блоги обратно в нисходящих представлениях + по убыванию createAt):
// ПОКАЗАТЬ - показать дополнительную информациюоб одном блоге
router.get("/:id", function(req, res){
//find the blog with provided ID
Blog.findById(req.params.id).populate("comments").exec(function(err, foundBlog){
if(err || !foundBlog){
req.flash("error", "Blog not found");
res.redirect("back");
} else {
Blog.findOneAndUpdate({ _id: req.params.id }, { $inc: { views: 1 } }, {new: true },function(err, response) {
if (err) {
console.log(err);
} else {
Blog.find({}, function(err, recentBlogs){
if(err){
console.log(err);
} else{
Blog.find({}, function(err, viewsBlogs){
if(err){
console.log(err);
} else{
res.render("blogs/show", {moment: moment, blogsR: recentBlogs, blogsV: viewsBlogs, currentUser: req.user, blog: foundBlog});
}
}).sort({ views: 'desc' });
}
}).sort({ createdAt: 'desc' });
}
});
}
});
});
особый случай 2 (в значительной степени тот же код, что и выше, за исключением заполнения комментариев и обновления количества просмотров):
// РЕДАКТИРОВАТЬ БЛОГ-МАРШРУТ
router.get("/:id/edit", middleware.isAdmin || middleware.checkBlogOwnership, function(req, res){
Blog.findById(req.params.id, function(err, foundBlog){
if(err){
req.flash("error", "Blog not found");
} else{
Blog.find({}, function(err, recentBlogs){
if(err){
console.log(err);
} else{
Blog.find({}, function(err, viewsBlogs){
if(err){
console.log(err);
} else{
res.render("blogs/edit", {moment: moment, blogsR: recentBlogs, blogsV: viewsBlogs, currentUser: req.user, blog: foundBlog});
}
}).sort({ views: 'desc' });
}
}).sort({ createdAt: 'desc' });
}
});
});