我正在嘗試制作一個包含帖子的網站,所以我有一個“閱讀更多”鏈接,可以在那里和那里擴展內容,就像 quora 一樣。我如何知道它被點擊的總次數以便我可以顯示視圖?
我使用 nodejs、express 和 mongodb 作為服務器。
這是我的 hbs(車把)檔案,帶有閱讀更多鏈接
<p class="startPara">{{stripTags (truncate body 200)}}<span class="dots" >...
</span></p>
<span class="content">
<p>{{stripTags (truncate body 400)}}</p>
</span>
<a onclick="readMoreFunction(this)" class="buttonReadMore" >Read more</a>
</div>
這是我的主要 hbs 檔案,它執行所有 js 其腳本標簽
<script>
function readMoreFunction(el) {
var parent = el.closest(".wrapper")
var dots = parent.querySelector(".dots");
var contentText = parent.querySelector(".content");
var btnText = parent.querySelector(".buttonReadMore");
var startPara=parent.querySelector(".startPara");
btnText.style.display = "none";
startPara.style.display= "none";
dots.style.display = "none";
contentText.style.display = "inline";
}
</script>
現在,每個帖子都是由唯一用戶唯一單擊的,因此僅增加變數將無濟于事。
所以請告訴我如何計算特定帖子的鏈接被點擊的總次數,然后如何將它傳達給資料庫,以便我可以在網頁上顯示它
uj5u.com熱心網友回復:
我想你需要在 MongoDB 中的 Post 上擁有一個“views”屬性。
您可以為您的getPostsapi 請求中的每個帖子提供前 400 個字符。
單擊閱讀更多可以呼叫getPost(id)您的 api,回傳完整的帖子有效負載,在此程序中,您可以將 post.views 增加一。
此外,正如@tobiv 在評論中建議的那樣,您可以擁有確保僅計算唯一訪問者點擊的代碼。
uj5u.com熱心網友回復:
在查看器會話和名為“viewed_posts”的資料庫列中存盤一個物件。使用該物件來確定他們是否查看了帖子。
if (typeof(req.session.viewed_posts[post_id]) == 'undefined') {
req.session.viewed_posts[post_id] = 1; //update session
//increment post count in posts table with post id
//update 'viewed_posts' column with new session
}
//select post
當“viewed_posts”中的物件變得太大(比如查看了 3000 個帖子)時,將其洗掉。如果普通觀眾每天閱讀 2 篇獨特的帖子,則需要 4.5 年才能在同一帖子上出現第二次獨特的瀏覽。
雖然這并不能永遠保證唯一性(仍然很長一段時間),但它更有效,因為..
您完全避免使用視圖表
帖子表中的視圖計數是單個數字(不搜索)
查看者不必搜索表來查看他們是否已經查看過帖子。他們只需要參考他們的會話。
使用 varchar(x) 和遞增的 id 而不是 uuid 來存盤物件。
或(我的首選方式)
反之亦然,在帖子的行中存盤一個物件,選擇它,決議它,檢查你是否在那里,如果不在那里插入 self 并在客戶端上,使用 object.keys 來獲取帖子有多少視圖。當物件太大時,洗掉最舊的鍵值對或停止添加鍵值對。
或者
使用視圖表選擇時使用連接子句
select * from posts as p LEFT JOIN views as v ON p.post_id = post_id AND p.post_id = v.post_id AND v.view_id = my_id LIMIT 2
//if the result length is 1, insert self into views
//if the result length is 2, you know that you have already viewed (don't insert)
//select post view count and return result[0] from above with count
或者
不要對視圖表使用連接
post = select * from posts where post_id = post_id
if_viewed = select COUNT(*) from views where post_id = post_id AND view_id = my_id
(if count is 0 insert into views)
post_views = select COUNT(*) from views WHERE post_id = post_id
//return post and post_views
uj5u.com熱心網友回復:
實際上,這是一個非常復雜的話題。
天真:讓按鈕單擊向更新資料庫的專用后端端點發送 ping。考慮多次點擊(因為用戶很無聊),閱讀完整帖子的其他方式等。
實用:考慮谷歌分析等。
不要:計算服務器上的請求數。瀏覽器會做一些奇怪的事情(預檢請求、不同的預覽等)。請求數可能與視圖數不對應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484645.html
標籤:javascript 节点.js 表示 车把.js
