首页 > 代码库 > Node.js 博客实例(十)pv统计和留言统计

Node.js 博客实例(十)pv统计和留言统计

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第十章,因为版本号等的原因,在原教程基础上稍加修改就可以实现。

post.js中将var post={...}修改为(每次修改此处之后都要将e:/mongodb/blog/清空):

//要存入数据库的文档
  var post = {
      name: this.name,
      time: time,
      title: this.title,
      post: this.post,
	  tags:this.tags,
	  comments:[],
	  pv:0
  };
     我们给要存储的文档加入了 pv 键并直接赋初值为 0。
继续将post.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);
			}
			//依据username、发表日期及文章名进行查询
			collection.findOne({
				"name": name,
				"time.day": day,
				"title": title
			}, function (err, doc) {
				
				if (err) {
					mongodb.close();
					return callback(err);
				}
				//解析 markdown 为 html
				if (doc) {
					collection.update({
						"name":name,
						"time.day":day,
						"title":title
					},{$inc:{"pv":1}
					},function(err){
						mongodb.close();
						if(err)
							return callback(err);
					}
					);
					doc.post=markdown.toHTML(doc.post);
					doc.comments.forEach(function (comment) {
						comment.content = markdown.toHTML(comment.content);
					});
				}
				callback(null, doc);//返回查询的一篇文章
			});
		});
	});
};
这里注意:collection.findOne({
"name": name,
"time.day": day,
"title": title
}, function (err, doc) {

if (err) {
mongodb.close();
return callback(err);
}
     这里mongodb.close();一定要放到if里面。否则会报错:

throw new Error(‘Can\‘t set headers after they are sent.‘);
Error: Can‘t set headers after they are sent.

原因是NODEJS异步机制,以下另一个mongodb.close()会运行。两个异步同一时候运行就会出错;。

改动 index.ejs 、user.ejs 及 article.ejs ,在:<p><%- post.post %></p>下一行加入一行代码:

<p class="info">阅读:<%= post.pv %> | 评论:<%= post.comments.length %></p>
     至此,文章就有了阅读次数和评论次数的展示:

技术分享

Node.js 博客实例(十)pv统计和留言统计