Nodejs post view count save database



我不熟悉这个东西,但我有一个基本的nodejs博客应用程序。我知道如何创建一个新的帖子和做CRUD,但我也想计算有多少次一个帖子被浏览。没有注册,所以我只是试着告诉应用程序,每次url被击中,比如localhost:3000/post/{{id}},计数器应该增加一个。

我有一个简单的逻辑,但我不能保存到数据库。我检查它在指南针和视图计数仍然为0。

这是邮递路线:

router.get('/post/:slug', (req, res) => {
Post.findOne({slug: req.params.slug})
.populate({path: 'comments', populate: {path: 'user', model: 'users'}})
.populate('user')
.then(post => {
let counter = req.body.viewCount
counter++
counter.save()
Category.find({})
.then(categories => {
res.render('home/post', {post: post, categories: categories});
});
});
});
module.exports = router; 

和模型(视图计数部分):

viewCount: {
type: Number,
default: 0
},

正确,所以如果你想在mongodb中增加一个值,我想推荐你一个类似的帖子:我如何在Mongoose中增加一个数字值?(或者你知道……任何随机的博客或官方文档)

我对这将如何应用于您的代码的有根据的猜测如下

router.get('/post/:slug', async (req, res) => {
await Post.findOneAndUpdate({slug : req.params.slug}, {$inc : {'counter' : 1}});
await Post.findOne({slug: req.params.slug})
.populate({path: 'comments', populate: {path: 'user', model: 'users'}})
.populate('user')
.then(post => {
return Category.find({})
.then(categories => {
res.render('home/post', {post: post, categories: categories});
});
});
});

(注意asyncawait)。这些是.then().catch()的更现代的等价物,你似乎仍然在使用)

话虽如此,虽然这将是你的MVP,你可能要考虑设置一些cookie每次有人访问的帖子。这样,cookie就会随着每个后续请求发送到您的浏览器,您可以确保用户不能仅仅通过一次又一次地刷新网站来增加一百万次浏览量:P可选地,同样的事情可以通过存储发出请求的ip来实现。

最新更新