天天看点

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

本笔记所有文章均算是仿照赵坤的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()

    找了好久才找的,要注意。

继续阅读