nodejs实战express笔记之实现用户和文章页面

来源:互联网 发布:淘宝客转链接软件 编辑:程序博客网 时间:2024/06/03 17:43
本笔记所有文章均算是仿照赵坤的node.js实战一书,记录学习过程

概念

  • 用户页面:单击某个用户链接名,跳转到:域名/u/用户,并列出该用户的所有文章
  • 文章页面:同理,某个文章的页面

    当访问这些页面的时候,会从路径中提取用户名,时间,标题等查询数据库并返回查询的文章信息,然后渲染文章页模板(article.ejs)生成页面显示给用户。

因此,整体步骤如下,

  • 修改数据库函数,便于获取文章信息
  • 创建新的用户和文章路由规则
  • 建立用户和文章ejs模板

修改post.js的数据库获取函数

  1. Post.get改为Post.getAll,同时把调用该函数的其它文件也相应改名,如index.js中的
  2. 新建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() 找了好久才找的,要注意。
0 0
原创粉丝点击