您的位置:首页 > Web前端 > Node.js

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

2014-08-28 14:30 501 查看
原教程 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);
}
//根据用户名、发表日期及文章名进行查询
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