本笔记所有文章均算是仿照赵坤的node.js实战一书,记录学习过程
概念
- 用户页面:单击某个用户链接名,跳转到:
,并列出该用户的所有文章域名/u/用户
-
文章页面:同理,某个文章的页面
当访问这些页面的时候,会从路径中提取用户名,时间,标题等查询数据库并返回查询的文章信息,然后渲染文章页模板(article.ejs)生成页面显示给用户。
因此,整体步骤如下,
- 修改数据库函数,便于获取文章信息
- 创建新的用户和文章路由规则
- 建立用户和文章ejs模板
修改post.js的数据库获取函数
- Post.get改为Post.getAll,同时把调用该函数的其它文件也相应改名,如index.js中的
- 新建Post.getOne()函数
//获取一篇文章
Post.getOne = function(name,day,title,callback){
//打开数据库
mongodb.open(function(err,db){
if(err){
return callback(err);
}
//读取posts集合
db.collection('posts',function(err,collection){
if(err){
mongodb.close();
return callback(err);
}
//根据用户名、发表日期、及文章名进行查询
collection.findOne({
"name":name,
"time.day":day,
"title":title
},function(err,doc){
mongodb.close();
if(err){
return callback(err);
}
//解析markdown
doc.post= markdown.toHTML(doc.post);
callback(null,doc);
});
});
});
};
添加用户页面的路由规则
在
app.post('/upload')
后添加如下代码
//用户页路由
app.get('/u/:name',function(req,res){
//检查用户是否存在
User.get(req.params.name,function(err,user){
if(!user){
req.flash('error','用户不存在');
return res.redirect('/');
}
//查询并返回该用户的所有文章
Post.getAll(user.name,function(err,posts){
if(err){
req.flash('err',err);
return res.redirect('/');
}
res.render('user',{
title:user.name,
posts:posts,
user:req.session.user,
success:req.flash('success').toString(),
error:req.flash('error').toString()
});
});
});
});
添加文章页的路由
接着上面的用户路由,添加下面代码
//文章页路由
app.get('/u/:name/:day/:title',function(req,res){
Post.getOne(req.params.name,req.params.day,req.params.title,function(err,post){
if(err){
req.flash('err',err);
return res.redirect('/');
}
res.render('article',{
title:req.params.title,
post:post,
user:req.session.user,
success:req.flash('success').toString(),
error:req.flash('error').toString()
});
});
});
新建user.ejs,并把首页index.ejs也修改成如下代码
<%- include header %>
<% posts.forEach(function(post,index){ %>
<p><h2>
<a href="/u/<%= post.name %>/<%= post.time.day %>/<%= post.title %>"><%= post.title %></a>
</h2></p>
<p class="info">
作者:<a href="/u/<%= post.name %>"><%= post.title %></a>
日期:<%= post.time.minute %>
</p>
<p><%- post.post %></p> //首页中可以把这个删掉
<% }) %>
<%- include footer %>
新建article.ejs模板,以供渲染
<%- include header %>
<p class="info">
作者:<a href="/u/<%= post.name %>"><%= post.name %></a>
日期:<%= post.time.minute %>
</p>
<p><%- post.post %></p>
<%- include footer %>
小结
至此,实现用户和文章页面功能完成,中间因为敲错字母,出了不少岔子。以后注意
比如:
- Post.getOne()函数在调用时没注意,写成了,getone()
-
的error:req.flash('error').toString()
敲成了toString()
找了好久才找的,要注意。toSring()