1. 现在,我们就来给博客添加文章检索功能。假定,可以根据关键字魔木查询文章标题,也就是说支持正则表达式,而且字母不会区分大小写。
1.1 首先,我们修改header.ejs,在其中修改如下代码:
<form class="navbar-form navbar-right" role="search" method="GET" action="/search"> <div class="form-group"> <input type="text" class="form-control" name="keyword" placeholder="Search"> </div> <button type="submit" class="btn btn-default">搜索</button> </form>
1.2 然后,我们打开post.js,在最后添加如下代码:
//返回通过标题关键字查询的所有文章信息 Post.search = function(keyword, callback) { mongodb.open(function (err, db) { if (err) { return callback(err); } db.collection('posts', function (err, collection) { if (err) { mongodb.close(); return callback(err); } var pattern = new RegExp(keyword, "i"); collection.find({ "title": pattern }, { "name": 1, "time": 1, "title": 1 }).sort({time: -1}).toArray(function (err, docs) { mongodb.close(); if (err) { return callback(err); } callback(null, docs); }); }); }); };
其中,我们通过pattern定义了一个包含关键字keyword的正则表达式,假设keyword字符串的开头或者结尾包含特殊字符,比如说*,则需要转义才可以。
1.3 然后,我们修改index.js,在其中添加如下代码,以作为对/search的路由相应:
//搜索页面的路由 router.get('/search', function (req, res) { Post.search(req.query.keyword, function (err, posts) { if (err) { req.flash('error', err); return res.redirect('/'); } res.render('search', { title: "SEARCH:" + req.query.keyword, posts: posts, user: req.session.user, success: req.flash('success').toString(), error: req.flash('error').toString() }); }); });
1.4 最后,我们在views下新建一个search.ejs的文件,在其中添加如下代码:
<%- include common/header %> <div class='container'> <ul class="list-group"> <% var lastYear = 0 %> <% posts.forEach(function (post, index) { %> <% if (lastYear != post.time.year) { %> <li class="list-group-item"><%= post.time.year %></li> <% lastYear = post.time.year } %> <li class="list-group-item list-group-item-info"><%= post.time.day %></li> <li class="list-group-item"> <span class="badge"><%= post.name %></span> <a href="/u/<%= post.name %>/<%= post.time.day %>/<%= post.title %>" style="color: purple;"><%= post.title %></a> </li> <% }) %> </ul> </div> <%- include common/footer %>
至此,我们就给博客添加了文章检索的功能。