[英]Display blog posts on different sections on the index page with Node.Js, Express and EJS
我对node.js和一般编程并不陌生,因此对于专家来说,这个问题听起来很愚蠢,但是我正在尝试构建一个简单的博客应用程序。 我苦苦挣扎的部分是如何将数据渲染到视图中。 我希望能够在索引页面的不同部分上显示基于类别(体育,时尚,新闻等)的帖子,类似于像www.newyorker.com这样的新闻网站的主页上的帖子。 我使用express,mongoose和ejs作为我的视图引擎。
谢谢!
--------
This is my app.js file:
var bodyParser = require("body-parser"),
methodOverride = require("method-override"),
expressSanitizer = require("express-sanitizer"),
mongoose = require("mongoose"),
express = require("express"),
app = express();
// APP CONFIG
mongoose.connect("mongodb://localhost/tnm_blog_app");
app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(bodyParser.urlencoded({extended: true}));
app.use(expressSanitizer());
app.use(methodOverride("_method"));
// MONGOOSE/MODEL CONFIG
var blogSchema = new mongoose.Schema({
title: String,
image: String,
body: String,
category: String,
author: String,
created: {type: Date, default: Date.now}
});
var Blog = mongoose.model("Blog", blogSchema);
// ROUTES
app.get("/", function(req, res){
res.redirect("/index");
});
// INDEX ROUTE
app.get("/index", function(req, res){
Blog.find({}, function(err, blogs){
if(err){
console.log("ERROR!");
} else {
res.render("index", {blogs: blogs});
}
});
});
// NEW ROUTE
app.get("/index/new", function(req, res){
res.render("new");
});
// CREATE ROUTE
app.post("/index", function(req, res){
Blog.create(req.body.blog, function(err, newBlog){
if(err){
res.render("new");
} else {
res.redirect("/index");
}
});
});
// SHOW ROUTE
app.get("/index/:id", function(req, res){
Blog.findById(req.params.id, function(err, foundBlog){
if(err){
res.redirect("/index");
} else {
res.render("show", {blog: foundBlog});
}
});
});
// EDIT ROUTE
app.get("/index/:id/edit", function(req, res){
Blog.findById(req.params.id, function(err, foundBlog){
if(err){
res.redirect("/index");
} else {
res.render("edit", {blog: foundBlog});
}
});
});
// UPDATE ROUTE
app.put("/index/:id", function(req, res){
req.body.blog.body = req.sanitize(req.body.blog.body);
Blog.findByIdAndUpdate(req.params.id, req.body.blog, function(err, updatedBlog){
if(err){
res.redirect("/index");
} else {
res.redirect("/index/" + req.params.id);
}
});
});
// DELETE ROUTE
app.delete("/index/:id", function(req, res){
Blog.findByIdAndRemove(req.params.id, function(err){
if(err){
res.redirect("/index");
} else {
res.redirect("/index");
}
});
});
app.listen(3000, function(){
console.log("SERVER IS RUNNING!");
});
This is my index.ejs file
------------------------
<% include ./partials/header %>
<div class="ui main text container">
<div class="ui huge header">The TNM Blog</div>
<div class="ui top attached segment">
<div class="ui divided items">
<% blogs.forEach(function(blog){ %>
<div class="item">
<div class="image">
<img src="<%= blog.image %>" >
</div>
<div class="content">
<a class="header" href="/blogs/<%= blog._id %>"><%=blog.title%></a>
<div class="meta">
<span><%= blog.created.toDateString() %></span>
</div>
<div class="description">
<p><%- blog.body.substring(0, 100) %>...</p>
</div>
<div class="extra">
<a class="ui floated basic violet button" href="/index/<%= blog._id %>">
Read More
<i class="right chevron icon"></i>
</a>
</div>
</div>
</div>
<% }) %>
</div>
</div>
</div>
<% include ./partials/footer %>
This is my show template
<% include ./partials/header %>
<div class="ui main text container segment">
<div class="ui huge header"><%= blog.title %></div>
<div class="ui top attached ">
<div class="item">
<img class="ui centered rounded image" src="<%= blog.image %>" >
<div class="content">
<span><%= blog.created.toDateString() %></span>
</div>
<div class="description">
<p><%- blog.body %></p>
</div>
<a class="ui orange basic button" href="/index/<%= blog._id %>/edit">Edit</a>
<form id="delete" action="/index/<%= blog._id %>?_method=DELETE" method="POST">
<button class="ui red basic button">Delete</button>
</form>
</div>
</div>
</div>
<% include ./partials/footer %>
您需要告诉渲染引擎帖子需要过滤到哪些类别,然后根据每个类别将不同的forEach循环放入ejs模板。 我敢肯定,您可以采用更聪明的方式提取类别,但是我只是在这里硬编码一个字符串数组:
// INDEX ROUTE
app.get("/index", function(req, res){
Blog.find({}, function(err, blogs){
if(err){
console.log("ERROR!");
} else {
var categories = ['news', 'shopping']
res.render("index", {blogs: blogs, categories: categories});
}
});
});
然后在您的ejs模板中,您可以创建一个forEach类别,然后显示符合该类别的博客
<% categories.forEach(function(category){ %>
<% blogs.forEach(function(blog){ %>
<% if(blog.category == category) { %>
<div class="item">
<div class="image">
<img src="<%= blog.image %>" >
</div>
<div class="content">
<a class="header" href="/blogs/<%= blog._id %>"><%=blog.title%></a>
<div class="meta">
<span><%= blog.created.toDateString() %></span>
</div>
<div class="description">
<p><%- blog.body.substring(0, 100) %>...</p>
</div>
<div class="extra">
<a class="ui floated basic violet button" href="/index/<%= blog._id %>">
Read More
<i class="right chevron icon"></i>
</a>
</div>
</div>
</div>
<% } %>
<% }) %>
<% }) %>
上面的方法肯定可以工作,但是效率低下,所以我也鼓励您尝试看看ejs是否支持JS过滤器功能
<% blogs.filter(b => b.category==category).forEach(function(blog){ %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.