ユーザーモードでユーザーを友達に追加する方法
この記事の目的は、開発者が友人のリクエストを受け入れた後、相手のユーザーモードの友人配列に情報を追加する方法をガイドすることを目的としています。この記事では、フロントエンドの改ざんを避け、ユーザーIDの改ざんを避け、FriendRequestモデルを介して友人リストを照会するための措置について説明します。また、友人のリクエストを受け入れるときにユーザーモードを更新する方法を導入し、データの一貫性を確保するためにトランザクションを使用することの重要性を強調します。
ユーザーIDのセキュリティを確認します
友人のリクエストを処理すると、フロントエンドから送信者IDを直接取得するセキュリティリスクがあります。悪意のあるユーザーは、HTMLを変更することにより送信者IDを偽造でき、その結果、データの矛盾または潜在的なセキュリティの問題が発生します。これを回避するには、現在のユーザーのIDをサーバー側のセッションまたは認証ミドルウェアから取得する必要があります。
たとえば、フロントエンドフォームには、レシーバーのIDのみを含めることができます。
バックエンドルーティングハンドラーでは、認証ミドルウェアが送信者として提供する現在のユーザーIDを使用します。
router.post( "/requests"、(req、res)=> { const {receiver} = req.body; friendRequest.create({ 送信者:req.user._id、//認証ミドルウェアから現在のユーザーIDを取得します 受信機 })then(()=> { Res.Status(204).send(); })。catch((error)=> { Res.Status(500).send( "ERROR Friend Request"); }); });
ここでは、req.user._idに認証されたユーザーのIDが含まれていると想定されています。使用している認証方法に従って、コードのこの部分を調整する必要があります。
FriendRequestモデルを介して友達リストをクエリします
よりエレガントな方法は、ユーザーモデルで友達アレイを明示的に維持しないようにすることです。代わりに、FriendRequestモデルを照会することで、友人のリストを取得できます。このアプローチは、FriendRequestモデルに既に存在する送信者とステータスフィールドを利用します。
たとえば、現在のユーザーのすべての受け入れられた友人を取得するには、次のクエリを使用できます。
友達リクエスト .find({sender:req.user._id、status: 'Accepted'}) .then((listOffriends)=> { console.log(listOffriends); }) .catch((e)=> { //エラーを処理します })
このアプローチの利点は、データの冗長性を回避し、友人の関係が変化したときにFriendRequestモデルを更新する必要があることです。
ユーザーモードで友達配列を更新します(注意して使用)
ユーザーモデルで友達の配列を明示的に維持する必要がある場合は、友人のリクエストを受け入れるときに両方のユーザーの友達配列を更新する必要があります。
router.post( "/requests/:id/accept"、async(req、res)=> { 試す { 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);を取得します。 //受信者ユーザーcurentuser.friends.push(request.receiver)を取得します。 otheruser.friends.push(req.user._id); culernuser.save(); othing otheruser.save(); res.redirect( "/requests"); } catch(error){ //エラーconsole.errorを処理する( "friend request:"、error)のエラー); res.Status(500).send( "ERROR Friend Request"); } });
注:トランザクションを使用します
複数のコレクションを更新するときは、データベーストランザクションを使用して、データの一貫性を確保してください。 FriendRequestモデルを更新した後、ユーザーモデルの更新が失敗した場合、データが一貫していない可能性があります。
Mongooseトランザクションの使用方法の例は次のとおりです。
const mongoose = require( 'mongoose'); router.post( "/requests/:id/accept"、async(req、res)=> { const session = await mongoose.startsession(); session.starttransaction(); 試す { 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); wait culernuser.save({session}); wait othersuser.save({session}); await session.committransaction(); session.endsession(); res.redirect( "/requests"); } catch(error){ assess.aborttransaction(); session.endsession(); //エラーconsole.errorを処理する( "friend request:"、error)のエラー); res.Status(500).send( "ERROR Friend Request"); } });
この例では、mongoose.startsession()が新しいセッションとsession.starttransaction()を作成します。トランザクションを開始します。すべてのデータベース操作は、セッション(セッション)を介してセッションオブジェクトを渡します。すべての操作が成功した場合、session.committransaction()がトランザクションをコミットします。それ以外の場合、session.aborttransaction()はトランザクションをロールバックし、すべての変更を取り消します。
要約します
友人のリクエストを処理する場合は、ユーザーIDのセキュリティに注意を払い、FriendRequestモデルを使用してFriendリストを照会してデータの冗長性を回避することを検討してください。ユーザーモデルで友達配列を明示的に維持する必要がある場合は、データベーストランザクションを使用してデータの一貫性を確保してください。選択する方法は、特定のニーズとデータの一貫性の要件に依存します。
以上がユーザーモードでユーザーを友達に追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

この記事では、JavaScriptを使用して画像をクリックする効果を実現する方法を紹介します。コアのアイデアは、HTML5のデータ - *属性を使用して、代替画像パスを保存し、JavaScriptを介してクリックイベントをリッスンし、SRC属性を動的に切り替えて、画像の切り替えを実現することです。この記事では、詳細なコードの例と説明を提供して、この一般的に使用されるインタラクティブ効果を理解し、習得するのに役立ちます。

まず、ブラウザがGeolocationapiをサポートしているかどうかを確認します。サポートされている場合は、getCurrentPosition()を呼び出してユーザーの現在の位置座標を取得し、成功したコールバックを通じて緯度と経度の値を取得します。同時に、拒否許可、場所の利用不能、タイムアウトなどのエラーコールバック処理の例外を提供します。また、高精度を有効にするために構成オプションを渡し、タイムアウト時間とキャッシュの妥当性期間を設定することもできます。プロセス全体には、ユーザー承認と対応するエラー処理が必要です。

JavaScriptに繰り返し間隔を作成するには、SetInterval()関数を使用する必要があります。これは、指定されたミリ秒間隔で関数またはコードブロックを繰り返し実行する必要があります。たとえば、setinterval(()=> {console.log( "2秒ごとに実行");}、2000)は、clearinterval(intervalid)によってクリアされるまで2秒ごとにメッセージを出力します。実際のアプリケーションでは、クロック、投票サーバーなどを更新するために使用できますが、最小遅延制限と機能実行時間の影響に注意を払い、メモリの漏れを避けるために不要になった時間の間隔をクリアします。特にコンポーネントのアンインストールまたはページの閉鎖の前に、それを確認してください

NUXT3の構成APIコア使用量には次のものが含まれます。1。DefinePageMetaは、タイトル、レイアウト、ミドルウェアなどのページメタ情報を定義するために使用されます。 2。Useheadは、ページヘッダータグを管理し、静的およびレスポンシブな更新をサポートし、SEO最適化を実現するためにDefinePageMetaと協力する必要があります。 3. useasyncdataは、非同期データを安全に取得し、負荷とエラーステータスを自動的に処理し、サーバーとクライアントのデータ収集制御をサポートします。 4. usefetchは、useasyncdataと$ fetchのカプセル化であり、リクエストキーを自動的にエンスして、リクエストを重複しないようにします

この記事の目的は、javascriptのdocument.getElementbyid()を介してDOM要素を取得するときにnullを返す問題を解決することを目的としています。コアは、スクリプトの実行タイミングとDOM解析ステータスを理解することです。タグを正しく配置するか、DomContentLoadedイベントを使用することにより、要素が利用可能なときに再び試行され、そのようなエラーを効果的に回避することができます。

このチュートリアルでは、JavaScriptに固定された2つの小数を持つ文字列に数値をフォーマットする方法を詳細に説明します。整数でさえ「#.00」の形で表示できます。 number.prototype.tofixed()メソッドの使用に焦点を当てます。これには、その構文、機能、サンプルコード、およびそのリターンタイプが常に文字列であるなどの重要なポイントが含まれます。

ClipboardapiのWriteTextメソッドを使用してテキストをクリップボードにコピーします。セキュリティコンテキストとユーザーインタラクションで呼び出され、最新のブラウザーをサポートし、古いバージョンをExecCommandで格下げできます。

thebestatatororeAteamulti-linestringinjavascriptsisingsisingSemplatalalswithbackticks、whitherverebreakenexactlyaswritten。
