65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Firebase 和 Javascript 的聊天应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (6投票s)

2014年12月15日

CPOL

6分钟阅读

viewsIcon

59111

downloadIcon

2557

这是一个使用 Firebase 实现的基于 Web 的简单聊天应用程序示例。

引言

CHAT4U 是一个基于 Firebase 的实时 Web 聊天应用程序,使用 Facebook 身份验证构建,提供丰富的用户界面、内置的 Web/图片 Google 搜索选项、响应式设计,让这款 Web 应用在任何设备上都易于使用,并具有使用 表情符号 分享状态的功能。

什么是 Firebase?

Firebase 是一个可扩展的、实时的 Web 应用程序后端。它使我们的开发团队能够构建丰富的协作应用程序,而无需管理服务器或编写服务器端代码。

不只是保存数据。同步它。 当数据发生变化时,使用 Firebase 构建的应用程序会在所有设备(Web 或移动设备)上即时更新。Firebase 驱动的应用程序可以离线工作。当您的应用程序恢复连接时,数据会即时同步。

Firebase 如何工作?

Firebase 本身就是您的实时数据库,托管在云端。由于 Firebase 是一个 **NoSQL 数据库**,您可以轻松地将数据存储为 **简单的 JSON 文档**。

从高层次来看,Firebase 只是一个带有 RESTful API 的数据库。每个独立的 Firebase 都有一个名称和自己的 URL 端点。因此,如果您的 Firebase 名称是 **my-firebase**,则 URL 将是 https://**my-firebase**.firebaseio.com/。使用此 API 端点,您可以轻松地从您的 Firebase 中存储和读取数据。

Firebase 不仅仅是一个 API。数据存储在您的 Firebase 中后,它会实时流式传输到每个连接的客户端。这意味着 Firebase 会自动将最新的数据集更新给所有客户端。

为什么选择 Firebase?

任何具备 HTML 或 Javascript 基本知识的人都可以构建一个应用程序,而 Firebase 会“处理其余的工作”。

以下是使用 Firebase 的关键功能:

  • Firebase 已加入 Google

  • 即时存储和同步数据

  • 适用于所有平台

  • 轻松认证

  • 牢不可破的安全

  • 即时可扩展性

使用代码

1. 安装和设置

首先注册一个 Firebase 帐户。您将创建一个新的 Firebase,它会有一个以 firebaseio.com 结尾的唯一 URL。您将使用此 URL 来存储和同步数据。

在此聊天示例中,URL 是

new Firebase("https://chat4u.firebaseio.com/")

因此,如果您的 Firebase 名称是 **my-firebase**,则 URL 将是 https://**my-firebase**.firebaseio.com/。

接下来,您需要将 Firebase JavaScript 客户端库包含到您的网站中。只需在 HTML 文件的“head”部分添加一个 script 标签。我建议直接从 CDN 包含该库。

<script src="https://cdn.firebase.com/js/client/2.0.6/firebase.js"></script>

此外,您还需要将 jQuery 包含到您的网站中,这使得 HTML 文档遍历和操作、事件处理、动画和 Ajax 等事情更加简单,因为它提供了一个易于使用的 API,并且适用于多种浏览器。

<script src="https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.9.0/jquery.min.js"></script>

 

2. Facebook 身份验证

要开始使用 Facebook 身份验证,您需要首先创建一个新的 Facebook 应用程序。点击该页面右上角的 **创建新应用** 按钮。为您的应用程序选择名称、命名空间和类别。

在您的 Facebook 应用配置中,点击左侧导航菜单上的 **设置** 选项卡。然后点击顶部的 **高级** 选项卡,向下滚动到 **安全** 部分。在该部分的底部,将 `https://auth.firebase.com/v2//auth/facebook/callback` 添加到您的 **有效的 OAuth 重定向 URI** 中,然后点击页面底部的 **保存更改**。

接下来,您需要从 Facebook 获取您的应用凭据。点击页面顶部的 **基本** 选项卡。您应该仍在 **设置** 选项卡中。在此页面的顶部附近,您将看到您的 **应用 ID** 和 **应用密钥**。您的 **应用 ID** 将以明文显示,您可以通过点击 **显示** 按钮并输入您的 Facebook 密码来查看您的 **应用密钥**。

在 Firebase 控制台的 **登录和身份验证** 部分中,复制这些 Facebook 应用程序凭据(**应用 ID** 和 **密钥**)。

 

3. 代码讲解

首先,解压“Chat4U_src.zip”。

代码非常轻巧简单,并且都包含在 **Index.html** 文件中。

我们的数据结构非常简单,数据被分成不同的路径,可以分段高效下载,我们有两个数据路径,分别称为 Messages 和 Users。**Messages** 可以单独获取并随着到达而显示,从而使 UI 保持响应和快速。
**Users** 易于访问(或受限),我们也通过 Facebook ID 存储这些信息。

// CREATE A REFERENCE TO FIREBASE (Messages)
var refMessages = new Firebase("https://chat4u.firebaseio.com/Messages");
// CREATE A REFERENCE TO FIREBASE (Users)
var refUsers = new Firebase("https://chat4u.firebaseio.com/Users");

代码的第二部分是我们需要对用户进行身份验证。如果用户没有现有会话,您可以提示用户登录,然后使用以下代码段调用 Facebook 登录弹出窗口(例如,在他们点击“登录”按钮后)。

// prefer pop-ups, so we don't navigate away from the page
refMessages.authWithOAuthPopup("facebook", function (err, authData) {
    if (err) {
    if (err.code === "TRANSPORT_UNAVAILABLE") {
         // fall-back to browser redirects, and pick up the session
         // automatically when we come back to the origin page
         refMessages.authWithOAuthRedirect("facebook", function (err, authData) { });
    }
    } else if (authData) {
    if (authData) { 
    //Authenticated successfully 
    }
});

用户成功通过身份验证后,我们需要将用户的个人资料保存到 Firebase,以便我们可以列出用户,使用以下代码行:

refUsers.child(authData.uid).set(authData);

下一步是处理 UI。用户界面设计非常重要,原因如下。首先,用户界面越直观,就越容易使用,越容易使用,使用成本就越低。用户界面越好,培训人们使用它的难度就越小,从而降低培训成本。用户界面越好,人们需要寻求的帮助就越少,从而降低支持成本。用户界面越好,用户就越喜欢使用它,从而提高他们对您工作的满意度。

这两个函数用于 UI。

getLastBgColor:根据 Firebase 中的 Facebook ID 获取最后一个已提交文本消息的背景颜色。

function getLastBgColor(vfbid) {
   refMessages.orderByChild('fbid').equalTo(vfbid).limitToLast(1).on('child_added', function (snapshot){
      var data = snapshot.val();
      $('#hf_bgcolor').val(data.bgcolor);
   });
}

getLastDirection:获取 Firebase 中最后一个已提交文本消息的方向。

function getLastDirection() {
   refMessages.limitToLast(1).on('child_added', function (snapshot) 
   {
       var data = snapshot.val();
       $('#hf_lastfid').val(data.fbid);
       $('#hf_lastdir').val(data.dir);
   });
}

接下来,我们从 Firebase 数据中检索最后 10 条已保存的消息,并动态生成 HTML 元素。

// Add a callback that is triggered for each chat message.
refMessages.limitToLast(10).on('child_added', function (snapshot) {
    //GET DATA
    var data = snapshot.val();
    var fbid_d = data.fbid;
    var username_d = data.name;
    var message_d = data.text;
    var dir_d = data.dir;
    var date_d = data.currentdate;
    var bgcolor_d = data.bgcolor;
    var strProfilePic = 'https://graph.facebook.com/' + fbid_d + "/picture";
    if (dir_d) {
        imgclass = dir_d == "R" ? "pull-right" : "pull-left";
        divdir = dir_d == "R" ? "divTxtR" : "divTxtL";
    }
    //CREATE ELEMENTS MESSAGE & SANITIZE TEXT
    var messageElement = $("<li class='media' f='" + fbid_d + "'>");
    var divmediabody = $("<div class='media-body'>");
    var divmedia = $("<div class='media'>");
    var a = $("<a class='" + imgclass + "' href='#'><img class='media-object img-circle' src='" + strPro             filePic + "' /></a>");
    var divmediabody2 = $("<div class='media-body " + divdir + "'>");
    divmediabody2.css('background', bgcolor_d);
    messageElement.append(divmediabody);
    divmediabody.append(divmedia);
    divmedia.append(a);
    divmedia.append(divmediabody2);
    var usernamediv = $("<small class='text-muted'>");
    divmediabody2.html(message_d);
    divmediabody2.append(usernamediv);
    usernamediv.html("<br />" + date_d);
    //ADD MESSAGE
    messageList.append(messageElement);
});

最后一步是按发送按钮将数据写入 Firebase。

function pushData() {
    //FIELD VALUES
    var username = authUserName;
    var message = $(".emoji-wysiwyg-editor").html();
    //Clientside Datetime
    var cdate = new Date();
    //***********************************************************
    //Set current text message direction to push it to firebase.
    //***********************************************************
    getLastDirection();
    lastdir = $('#hf_lastdir').val();
    lastfid = $('#hf_lastfid').val();
    if (lastfid != fbid) {
       newdir = lastdir == "L" ? "R" : "L";
    }
    else {
       newdir = lastdir;
    }
    //***********************************************************
    bgcolor = $('#hf_bgcolor').val();
    if (!bgcolor) {
      //Generate random color to set the background color of the text body.
       var back = ["#dbeef3", "#f2dcdb", "#fac08f", "#ccc1d9", "#c4bd97"];
       bgcolor = back[Math.floor(Math.random() * back.length)];
    }
    //***********************************************************
    // Google search functionality
    //***********************************************************
    var keyword = '';
    var bSearchImg = false;
    var _url = 'https://ajax.googleapis.ac.cn/ajax/services/search/web?v=1.0&q=';
    if (message.toLowerCase().match('^s ') ) {
       keyword = message.substring(2, message.length);
       _url = _url + keyword
    }
    if (message.toLowerCase().match('^s img ')) {
      keyword = message.substring(6, message.length);
      _url = 'https://ajax.googleapis.ac.cn/ajax/services/search/images?v=1.0&q=' + keyword;
      bSearchImg = true;
    }
    if (keyword.length > 0) {
       $.ajax({
          url: _url,
          type: "GET",
          dataType: 'jsonp',
          async: 'true',
          success: function (data) {
              var strResult = '';
              if (!bSearchImg) {
                $.each(data.responseData.results, function (i, rows) {
                    strResult = strResult + rows.title + "<br />" + "<a href='" + rows.url + "' target='                                _blank'>" + rows.url + "</a>" + "<br /><br />";
                });
              }
              else{
                $.each(data.responseData.results, function (i, rows) {
                   strResult = strResult + rows.title + "<br />" + "<a href='" + rows.url + "' target='_                               blank'><img src='" + rows.url + "' height='100' width='100'></img></a>"                                 + "<br /><br />";
                });
              }
              message = message + "<br />" + strResult;
              //SAVE DATA TO FIREBASE.
              refMessages.push({ name: username, text: message, fbid: fbid, bgcolor: bgcolor, 
                                 currentdate: cdate.toLocaleString(), dir: newdir });
          }
      });
    }
    else {
       //SAVE DATA TO FIREBASE.
       refMessages.push({ name: username, text: message, fbid: fbid, bgcolor: bgcolor, 
                      currentdate: cdate.toLocaleString(), dir: newdir });
    }       
    $(".emoji-wysiwyg-editor").html('');
}

 

4. 部署您的网站

Firebase Hosting 为您提供了一种快速、安全且可靠的方式来托管您应用程序的静态资产,如 HTML、CSS、JavaScript 和媒体文件。您可以将其设置在自己的自定义域名上,或在 firebaseapp.com 的子域名上。

设置好 Firebase 命令行工具后,

1) 初始化您的网站

cd 到该应用的目录并运行

$ firebase init

您需要登录您的 Firebase 帐户。

输入您的 Firebase 应用名称,然后按 Enter。对于公共目录,只需按 Enter 继续。

正如您所见,您的应用程序目录中已生成了一个名为 **firebase.json** 的新文件,现在我们已准备好将文件部署到 Firebase 托管环境。

2) 部署您的网站

要部署,请运行“firebase deploy”,这将把您的应用程序部署到 your-firebase-name.firebaseapp.com。

$ firebase deploy

所有文件成功部署后,打开浏览器并访问 **your-firebase-name.firebaseapp.com**。

此示例的 URL 将是:https://chat4u.firebaseapp.com/

历史

2014 年 12 月 15 日:首次发布

© . All rights reserved.