[Node.jsを一緒に学ぶ][009話]文章検索機能を追加

2688 ワード

ここでは、キーワードに基づいて文章のタイトルを曖昧に検索し、アルファベットで大文字と小文字を区別しない文章検索機能を追加します.まずheaderを修正しますejs、</nav>の前にコードを追加します.
<span><form action="/search" method="GET"><input type="text" name="keyword" placeholder="SEARCH" class="search" /></form></span>

header.ejsにスタイルを追加するには、次の手順に従います.
.search{border:0;width:6em;text-align:center;font-size:1em;margin:0.5em 0;}

開けて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) {
         callback(err, null);
        }
        callback(null, docs);
      });
    });
  });
};

注意:patternによってキーワードkeywordを含む正則を定義し、keyword文字列の先頭または末尾に特殊文字(例えば*)を含む場合は転義が必要です.つまり、キーワードkeywordは限られた正則をサポートします.
indexを変更します.jsは、app.get('/u/:name')の前に次のコードを追加します.
app.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()
    });
  });
});

viewsフォルダの下にsearchを新規作成します.ejs、次のコードを追加します.
<%- include header %>
<ul class="archive">
<% var lastYear=0 %>
<% posts.forEach(function(post, index){ %>
  <% if(lastYear!=post.time.year){ %>
    <li><h3><%= post.time.year %></h3></li>
  <% lastYear=post.time.year } %>
    <li><time><%= post.time.day %></time></li>
    <li><a href="/u/<%= post.name %>/<%= post.time.day %>/<%= post.title %>"><%= post.title %></a></li>
<% }) %>
</ul>
<%- include footer %>

注意:今までarchiveを発見しました.ejs 、tag.ejsとsearch.ejsコードはまったく同じです.私たちは同じレイアウトを使っているからです.これもテンプレートの利点の一つを際立たせ、再利用することができます.
ブログに記事検索機能を追加しました.