目次
Express を使用してアプリケーションを構築しているため、この部分は非常に単純で、開始するには
持久登录
结论
ホームページ ウェブフロントエンド jsチュートリアル React: 永続的なデータとシームレスなセッションの確保

React: 永続的なデータとシームレスなセッションの確保

Sep 01, 2023 pm 09:49 PM

React: 永続的なデータとシームレスなセッションの確保

「私を覚えてください」機能は非常に便利な機能で、React と Express を使用して実装するのは比較的簡単です。 WebRTC チャット アプリケーションをセットアップする前の部分を続けて、Mongo がサポートする永続セッションと、データベースがサポートするオンライン ユーザーのリストを追加します。

###セッション?

これまでセッションを使用したことがない場合、セッションはアプリケーションのアクティブ ユーザーをリアルタイムで追跡できるという点で Cookie に非常に似ています。セッションは実際には、アプリケーションからの要求/応答ヘッダーで送信される

session cookie を介して機能します。

つまり、Cookie とセッションは本質的に絡み合っています。すでに Cookie があるのに、なぜセッションが必要なのでしょうか?セッションでは、アプリケーションのサーバー部分で使用されるバックエンド ストレージを定義する機能も提供されます。これは、アプリが必要とするときにいつでもデータベースから情報を取得できることを意味します。

したがって、実際のチャット アプリケーションの例では、ユーザーのユーザー名を保存できるようになりました。また、アプリケーションを少し再構成すると、チャット履歴全体をログ用のデータベースに挿入することもできます。

次の例では、永続的なバックエンド ストレージとして Mongo データベースを使用します。これは、セッション ストレージに使用できるいくつかのオプションの 1 つであり、複数の Web サーバーを使用する大規模な運用セットアップに強くお勧めするもう 1 つのオプションは memcache です。

ドキュメントストレージ

Mongo は NoSQL ドキュメント ストレージ エンジンであり、人気のある MySQL のようなリレーショナル データ ストアではありません。以前に MySQL または同様のデータベースを使用したことがあり、Mongo の速度に慣れる必要がある場合、NoSQL は非常に簡単に始めることができ、それほど時間はかかりません。知っておくべき最大の違いは次のとおりです:

    名前が示すように、NoSQL はクエリの実行に SQL を使用しません。代わりに、データはメソッド呼び出しを通じて抽象化されます。たとえば、
  • db.collectionName.find()SELECT * FROM table になります。
  • 用語が異なります。MySQL にはテーブル、行、列がありますが、Mongo にはコレクション、ドキュメント、キーがあります。
  • データは JSON オブジェクトと同じように構造化されています。
Mongo をまだお持ちでない場合は、パッケージ マネージャーを通じてインストールしてください。たとえば、Linux ベースのディストリビューションの場合:

リーリー

Mongo をインストールした後、npm が提供する

mongoose モジュールを使用して、チャット アプリケーションに Mongo サポートを簡単に追加できます。次のコマンドを使用して mongoose をインストールします: リーリー

次に、アプリケーションに Mongo を追加しましょう。コード エディターを起動し、

app.js を開き、スクリプトの先頭を次のように設定します。 リーリー

require('mongoose')mongoose を含めて、 mongoose.connect('mongodb://localhost:27017/chat') ;## を渡します。 #。

/chat

接続するデータベースの名前を定義します。 次に、開発目的で、デバッグをオンに設定することをお勧めします。

リーリー

最後に、エラー イベントのハンドラーを追加します:

リーリー

次に、次のコードを使用して接続のチェックを追加できます。

リーリー

mongoose

の使用方法は、db インスタンスが open イベントを受信すると、mongo 接続の実行に移ります。したがって、既存のコードをこの新しい mongo 接続にラップして使用する必要があります。 以下は、ユーザーがオンラインおよびオフラインのときに mongoose を追加し、行を挿入および削除する完全なコードのリストです。

リーリー

これが実際にどうなるかを確認するために、チャット アプリケーションを起動してみましょう。

npm start

を実行して開始します。 これで、ブラウザで通常どおりチャットに接続できるようになりました (デフォルトは http://localhost:3001)。

チャットに接続した後、新しいターミナル ウィンドウで

mongo chat

を開き、mongo cli を入力します。 リーリー ここに

mongo

ドキュメント レコードが保存されています。mongo プロンプトで db.users.count を実行すると、いつでもオンライン() になっているユーザーの数を確認できます。 リーリー セッションをアプリに追加する

Express を使用してアプリケーションを構築しているため、この部分は非常に単純で、開始するには

npm

からいくつかのモジュールをインストールするだけで済みます。 npm から

express-session

および connect-mongo パッケージを取得します: リーリー 次に、これらを

app.js

の先頭に含めます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'> var PeerServer = require('peer').PeerServer, cookieParser = require('cookie-parser'), express = require('express'), session = require('express-session'), mongoose = require('mongoose'), MongoStore = require('connect-mongo')(session), //... </pre><div class="contentsignin">ログイン後にコピー</div></div> <p>设置 <code class="inline">mongoose.connect 后,您可以使用 Express 配置会话。将您的代码更改为以下内容;您可以指定自己的 secret 字符串。

//Connect to the database
mongoose.connect('mongodb://localhost:27017/chat');
var db = mongoose.connection;

mongoose.set('debug', true);

db.on('error', console.error.bind(console, '# Mongo DB: connection error:'));

app.use(cookieParser());
app.use(session({
  secret: 'supersecretstring12345!',
  saveUninitialized: true,
  resave: true,
  store: new MongoStore({ mongooseConnection: db })
}))
ログイン後にコピー

这里需要注意的一个关键设置是最后一个 app.use 中的 saveUninitialized: true 。这将确保保存会话。

我们使用 store 属性指定位置,该属性设置为 MongoStore 实例,通过 mongooseConnection 和我们的 db 对象。

为了存储到会话中,我们需要使用express来处理请求,因为我们需要访问请求值,例如:

//Start persistent session for user
app.use(function(req, res, next) {
	req.session.username = id;
	req.session.save();
ログイン後にコピー

这将使用用户输入的值创建 req.session.username 变量并保存以供稍后使用。

接下来,我们可以使用客户端代码检查此值,并在用户刷新时自动登录,这样他们就永远不会退出聊天并自动以其选择的用户名登录。

还值得注意的是,因为我们有数据库支持的会话,所以如果开发人员更改应用程序和后端重新加载,登录到其客户端的用户将保持登录状态,因为会话存储是现在执着。这是一个很棒的功能,可以让您的用户在开发过程中或在与不稳定的客户端断开连接时始终保持登录状态。

持久登录

现在我们已经设置了会话 cookie 部分,接下来让我们将持久登录添加到我们的前端代码中。

到目前为止,我们只是使用了 Express 为 SPA 应用程序提供的默认路由,并没有为 Express 定义任何路由处理。正如我之前提到的,要访问会话,您将需要 Express 的请求/响应变量。

首先,我们需要一个路由,以便我们可以访问 Express 提供的 request 对象并显示它以进行调试。在 /app.js 中的 Express 配置内,在会话设置之后,在文件顶部附近添加以下内容:

app.use(session({
  secret: 'supersecretstring12345!',
  saveUninitialized: true,
  resave: true,
  store: new MongoStore({ mongooseConnection: db })
}))

app.get('/', function (req, res) {
  res.sendFile(__dirname +'/src/index.html');
  if(req.session.username == undefined){
    console.log("# Username not set in session yet");
  } else {
    console.log("# Username from session: "+ req.session.username);

  }
});
ログイン後にコピー

现在我们有一些基本的日志记录来查看我们的会话值发生了什么。为了设置它,我们需要像这样配置 getter 和 setter 路由:

//Save the username when the user posts the set username form
app.post('/username', function(req, res){
  console.log("# Username set to "+ req.body.username);
  req.session.username = req.body.username;
  req.session.save();
  console.log("# Session value set "+ req.session.username);
  res.end();
});

//Return the session value when the client checks
app.get('/username', function(req,res){
  console.log("# Client Username check "+ req.session.username);
  res.json({username: req.session.username})
});
ログイン後にコピー

这两条路由将用作用户名会话变量的获取和设置。现在,通过一些基本的 JavaScript,我们可以为我们的应用程序实现自动登录。打开src/App.js,修改如下:

/* global EventEmitter, events, io, Peer */
/** @jsx React.DOM */

$(function () {
  'use strict';

  // Check for session value
  $(document).ready(function(){
    $.ajax({
          url: '/username'
    }).done(function (data) {
      console.log("data loaded: " + data.username);
      if(data.username)
        initChat($('#container')[0], data.username);
    });
  });

  // Set the session
  $('#connect-btn').click(function(){
    var data = JSON.stringify({username: $('#username-input').val()});
    $.ajax({ url: '/username',
              method: "POST",
              data: data,
              contentType: 'application/json',
              dataType: 'json'
            });
  });

  // Initialize the chat
  $('#connect-btn').click(function () {
    initChat($('#container')[0],
      $('#username-input').val());
  });

  function initChat(container, username) {
    var proxy = new ChatServer();
    React.renderComponent(, container);
  }

  window.onbeforeunload = function () {
    return 'Are you sure you want to leave the chat?';
  };

});
ログイン後にコピー

使用 jQuery 的 $.ajax 工具,我们创建一个请求,以在 文档 可用时检查会话变量的值。如果设置了,我们就会使用存储的值初始化我们的 React 组件,从而为我们的用户提供自动登录功能。

使用 npm start 再次启动聊天,并在浏览器中查看会话是否正常工作。

结论

现在您已经看到将 Mongoose 与 Express 结合使用并设置 Express 会话是多么容易。使用 React 作为链接到数据库支持元素的视图控制器来进一步开发应用程序将创建一些重要的应用程序。

如果您想进一步了解 React 并了解组件如何在 React 框架内部相互通信,官方文档中的这份指南非常有用。

以上がReact: 永続的なデータとシームレスなセッションの確保の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles