目錄
確保用戶ID的安全性
通過FriendRequest 模型查詢好友列表
更新用戶模式中的friends 數組(謹慎使用)
首頁 web前端 js教程 如何在用戶模式中向好友數組添加用戶

如何在用戶模式中向好友數組添加用戶

Oct 01, 2025 am 07:45 AM

如何在用戶模式中向好友數組添加用戶

本文旨在指導開發者如何在用戶接受好友請求後,將其信息添加到對方用戶模式的friends 數組中。文章將討論避免前端篡改用戶ID的措施,並通過FriendRequest 模型查詢好友列表,同時也會介紹如何在接受好友請求時更新用戶模式,並強調使用事務以保證數據一致性的重要性。

確保用戶ID的安全性

在處理好友請求時,直接從前端獲取發送者(sender)ID存在安全風險。惡意用戶可以通過修改HTML來偽造發送者ID,從而導致數據不一致或潛在的安全問題。為了避免這種情況,應該從服務器端的會話或身份驗證中間件中獲取當前用戶的ID。

例如,前端表單可以只包含接收者(receiver)的ID:

 

在後端路由處理程序中,使用身份驗證中間件提供的當前用戶ID作為發送者:

 router.post("/requests", (req, res) => {
  const { receiver } = req.body;

  FriendRequest.create({
    sender: req.user._id, // 從身份驗證中間件獲取當前用戶ID
    receiver
  }).then(() => {
    res.status(204).send();
  }).catch((error) => {
    res.status(500).send("Error sending friend request");
  });
});

這裡假設req.user._id 包含了經過身份驗證的用戶的ID。你需要根據你使用的身份驗證方法調整這部分代碼。

通過FriendRequest 模型查詢好友列表

一種更優雅的方式是避免在User 模型中顯式維護friends 數組。相反,可以通過查詢FriendRequest 模型來獲取好友列表。這種方法利用了FriendRequest 模型中已經存在的sender 和status 字段。

例如,要獲取當前用戶的所有已接受的好友,可以使用以下查詢:

 FriendRequest
  .find({sender: req.user._id, status: 'accepted'})
  .then((listOfFriends)=>{
    console.log(listOfFriends);
  })
  .catch((e)=>{
    // handle error
  })

這種方法的優點是避免了數據冗餘,並且在好友關係發生變化時,只需要更新FriendRequest 模型即可。

更新用戶模式中的friends 數組(謹慎使用)

如果仍然需要在User 模型中顯式維護friends 數組,則需要在接受好友請求時更新這兩個用戶的friends 數組。

 router.post("/requests/:id/accept", async (req, res) => {
  try {
    const request = await FriendRequest.findById(req.params.id);
    request.status = "accepted";
    await request.save();

    const currentUser = await User.findById(req.user._id); // 獲取當前用戶const otherUser = await User.findById(request.receiver); // 獲取接收者用戶currentUser.friends.push(request.receiver);
    otherUser.friends.push(req.user._id);

    await currentUser.save();
    await otherUser.save();

    res.redirect("/requests");
  } catch (error) {
    // 處理錯誤console.error("Error accepting friend request:", error);
    res.status(500).send("Error accepting friend request");
  }
});

注意事項:使用事務

在更新多個集合時,務必使用數據庫事務來確保數據一致性。如果在更新FriendRequest 模型後,更新User 模型失敗,則可能導致數據不一致。

以下是如何使用Mongoose 事務的示例:

 const mongoose = require('mongoose');

router.post("/requests/:id/accept", async (req, res) => {
  const session = await mongoose.startSession();
  session.startTransaction();
  try {
    const request = await FriendRequest.findById(req.params.id).session(session);
    request.status = "accepted";
    await request.save({ session });

    const currentUser = await User.findById(req.user._id).session(session); // 獲取當前用戶const otherUser = await User.findById(request.receiver).session(session); // 獲取接收者用戶currentUser.friends.push(request.receiver);
    otherUser.friends.push(req.user._id);

    await currentUser.save({ session });
    await otherUser.save({ session });

    await session.commitTransaction();
    session.endSession();

    res.redirect("/requests");
  } catch (error) {
    await session.abortTransaction();
    session.endSession();
    // 處理錯誤console.error("Error accepting friend request:", error);
    res.status(500).send("Error accepting friend request");
  }
});

在這個示例中,mongoose.startSession() 創建一個新的會話,session.startTransaction() 啟動事務。所有的數據庫操作都通過.session(session) 傳遞會話對象。如果所有操作都成功,則session.commitTransaction() 提交事務;否則,session.abortTransaction() 回滾事務,撤銷所有更改。

總結

在處理好友請求時,務必注意用戶ID的安全性,並考慮使用FriendRequest 模型查詢好友列表,以避免數據冗餘。如果需要在User 模型中顯式維護friends 數組,則務必使用數據庫事務來確保數據一致性。選擇哪種方法取決於你的具體需求和對數據一致性的要求。

以上是如何在用戶模式中向好友數組添加用戶的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

JavaScript實現點擊圖片切換效果:專業教程 JavaScript實現點擊圖片切換效果:專業教程 Sep 18, 2025 pm 01:03 PM

本文將介紹如何使用JavaScript實現點擊圖片切換的效果。核心思路是利用HTML5的data-*屬性存儲備用圖片路徑,並通過JavaScript監聽點擊事件,動態切換src屬性,從而實現圖片切換。本文將提供詳細的代碼示例和解釋,幫助你理解和掌握這種常用的交互效果。

如何使用JavaScript中的GeOlocation API獲取用戶的位置? 如何使用JavaScript中的GeOlocation API獲取用戶的位置? Sep 21, 2025 am 06:19 AM

首先檢查瀏覽器是否支持GeolocationAPI,若支持則調用getCurrentPosition()獲取用戶當前位置坐標,並通過成功回調獲取緯度和經度值,同時提供錯誤回調處理權限被拒、位置不可用或超時等異常,還可傳入配置選項以啟用高精度、設置超時時間和緩存有效期,整個過程需用戶授權並做好相應錯誤處理。

如何在JavaScript中使用setInterval創建重複間隔 如何在JavaScript中使用setInterval創建重複間隔 Sep 21, 2025 am 05:31 AM

要創建JavaScript中的重複間隔,需使用setInterval()函數,它會以指定毫秒數為間隔重複執行函數或代碼塊,例如setInterval(()=>{console.log("每2秒執行一次");},2000)會每隔2秒輸出一次消息,直到通過clearInterval(intervalId)清除,實際應用中可用於更新時鐘、輪詢服務器等場景,但需注意最小延遲限制、函數執行時間影響,並在不再需要時及時清除間隔以避免內存洩漏,特別是在組件卸載或頁面關閉前應清理,確保

JavaScript中DOM元素訪問的常見陷阱與解決方案 JavaScript中DOM元素訪問的常見陷阱與解決方案 Sep 15, 2025 pm 01:24 PM

本文旨在解決JavaScript中通過document.getElementById()獲取DOM元素時返回null的問題。核心在於理解腳本執行時機與DOM解析狀態。通過正確放置標籤或利用DOMContentLoaded事件,可以確保在元素可用時再嘗試訪問,從而有效避免此類錯誤。

NUXT 3組成API解釋了 NUXT 3組成API解釋了 Sep 20, 2025 am 03:00 AM

Nuxt3的CompositionAPI核心用法包括:1.definePageMeta用於定義頁面元信息,如標題、佈局和中間件,需在中直接調用,不可置於條件語句中;2.useHead用於管理頁面頭部標籤,支持靜態和響應式更新,需與definePageMeta配合實現SEO優化;3.useAsyncData用於安全地獲取異步數據,自動處理loading和error狀態,支持服務端和客戶端數據獲取控制;4.useFetch是useAsyncData與$fetch的封裝,自動推斷請求key,避免重複請

如何將文本複製到JavaScript中的剪貼板? 如何將文本複製到JavaScript中的剪貼板? Sep 18, 2025 am 03:50 AM

使用ClipboardAPI的writeText方法可複製文本到剪貼板,需在安全上下文和用戶交互中調用,支持現代瀏覽器,舊版可用execCommand降級處理。

JavaScript中數字格式化:使用toFixed()方法保留固定小數位 JavaScript中數字格式化:使用toFixed()方法保留固定小數位 Sep 16, 2025 am 11:57 AM

本教程詳細講解如何在JavaScript中將數字格式化為固定兩位小數的字符串,即使是整數也能顯示為"#.00"的形式。我們將重點介紹Number.prototype.toFixed()方法的使用,包括其語法、功能、示例代碼以及需要注意的關鍵點,如其返回類型始終為字符串。

如何在JavaScript中創建多行字符串? 如何在JavaScript中創建多行字符串? Sep 20, 2025 am 06:11 AM

thebestatoreateamulti-linestlinginjavascriptsisisingsistisingtemplatalalswithbacktticks,whatpreserveticks,whatpreservereakeandeexactlyaswrite。

See all articles