首頁 > web前端 > js教程 > 構建一個node.js供電的聊天室網絡應用:節點,mongodb和套接字

構建一個node.js供電的聊天室網絡應用:節點,mongodb和套接字

William Shakespeare
發布: 2025-02-20 09:30:13
原創
453 人瀏覽過

構建一個node.js供電的聊天室網絡應用:節點,mongodb和套接字

鑰匙要點

  • >該教程提供了使用node.js,mongodb和socket.io構建實時聊天室應用程序的逐步指南。聊天室將完全部署在雲中。
  • >
  • >教程解釋瞭如何使用socket.io創建基於雙向事件的實時交流應用程序。它簡化了大量使用Websocket的過程。
  • >
  • >教程顯示瞭如何記錄用戶加入和離開聊天室以及如何在聊天頻道上收到的消息傳播到套接字上的所有其他連接。 >>>>>>>>>
  • >教程演示瞭如何將聊天消息保存到mongoDB數據庫,以及如何發射收到的最後10條消息,以向加入聊天室的每個新用戶提供上下文。
  • >
  • >教程以聊天系統的結尾,能夠向所有其他連接的客戶端廣播通過WebSocket收到的消息。系統將消息保存到數據庫,並為每個新用戶檢索最後10條消息。
  • >
本文是Microsoft的Web開發技術系列的一部分。感謝您支持使SitietPoint成為可能的合作夥伴。 >該教程將使用可選的Visual Studio和Node.js工具作為開發環境。我為這兩個工具免費下載提供了鏈接。這是中級文章的初學者 - 您有望了解HTML5和JavaScript。 第1部分 - Node.js

簡介

第2部分 - 歡迎使用node.js和azure

第3部分 - 使用node.js,mongo and socket.io 構建後端
第4部分 - 使用Bootstrap構建聊天室UI

第5部分 - 將聊天室與WebSockets連接

第6部分 - 結局和調試遠程node.js應用

第3部分 - 使用node.js,socket.io和mongo

建立聊天室後端

歡迎使用動手Node.js教程系列的第3部分:構建一個Node.js驅動的聊天室Web應用程序。 在本期中,我將向您展示如何使用您現有的基於Express的Node.js應用程序來創建聊天室後端,並提供WebSocket支持。

什麼是Websocket?什麼是socket.io?

websocket是一種協議,旨在允許Web應用程序通過Web瀏覽器和Web服務器之間的TCP(即進行雙向通信)創建一個完整的通道。它與HTTP完全兼容,並使用TCP端口編號80。 WebSocket允許Web應用程序成為實時,並支持客戶端和服務器之間的高級交互。它得到了多個瀏覽器的支持,包括Internet Explorer,Google Chrome,Firefox,Safari和Opera。

> socket.io是一個JavaScript庫和node.js模塊,可讓您簡單,快速地創建基於雙向事件的實時雙向通信應用。它簡化了大量使用Websocket的過程。我們將使用socket.io v1.0來製作我們的聊天室應用。

>

>將socket.io添加到package.json

package.json是一個包含與項目相關的各種元數據的文件,包括其依賴關係。 NPM可以使用此文件下載項目所需的模塊。看一下package.json及其可以包含的交互式解釋。 >

>讓我們將socket.io添加到項目中。有兩種方法可以做到。

>

如果您一直關注教程系列,並且在Visual Studio設置中進行了一個項目,請右鍵單擊項目的NPM部分,然後選擇“安裝新的NPM軟件包……”

  1. >打開窗口後,搜索“ socket.io”,選擇頂部結果,然後檢查“添加到package.json”複選框。單擊“安裝軟件包”按鈕。這將將socket.io安裝到您的項目中,並將其添加到package.json文件中。
package.json 構建一個node.js供電的聊天室網絡應用:節點,mongodb和套接字

構建一個node.js供電的聊天室網絡應用:節點,mongodb和套接字如果您在OS X或Linux上,則可以通過在項目文件夾的根部運行以下命令來實現與上面的操作。

<span>{
</span>  <span>"name": "NodeChatroom",
</span>  <span>"version": "0.0.0",
</span>  <span>"description": "NodeChatroom",
</span>  <span>"main": "app.js",
</span>  <span>"author": {
</span>    <span>"name": "Rami Sayar",
</span>    <span>"email": ""
</span>  <span>},
</span>  <span>"dependencies": {
</span>    <span>"express": "3.4.4",
</span>    <span>"jade": "*",
</span>    <span>"socket.io": "^1.0.6",
</span>    <span>"stylus": "*"
</span>  <span>}
</span><span>}</span>
登入後複製
登入後複製
登入後複製
    >將socket.io添加到app.js
  1. 下一步是將socket.io添加到app.js。您可以通過替換以下代碼來實現這一目標……
>
<span>npm install --save socket.io</span>
登入後複製
登入後複製
登入後複製

…with:

>這將在稱為服務的變量中捕獲HTTP服務器,並通過該http服務器,以便socket.io模塊可以連接到它。最後一個代碼塊採用服務變量並執行啟動HTTP服務器的偵聽功能。 >
http<span>.createServer(app).listen(app.get('port'), function(){
</span>  <span>console.log('Express server listening on port ' + app.get('port'));
</span><span>});</span>
登入後複製
登入後複製
登入後複製
記錄用戶加入並離開

>

>理想情況下,我們想記錄加入聊天室的用戶。以下代碼可以通過掛接回調函數在每個連接事件上通過Websocket到我們的HTTP服務器執行的來實現。在回調函數中,我們調用Console.log記錄該用戶已連接的。我們可以在致電serve.listen後添加此代碼。
<span>var serve = http.createServer(app);
</span><span>var io = require('socket.io')(serve);
</span>
serve<span>.listen(app.get('port'), function() {
</span>    <span>console.log('Express server listening on port ' + app.get('port'));
</span><span>});</span>
登入後複製
登入後複製
>
<span>{
</span>  <span>"name": "NodeChatroom",
</span>  <span>"version": "0.0.0",
</span>  <span>"description": "NodeChatroom",
</span>  <span>"main": "app.js",
</span>  <span>"author": {
</span>    <span>"name": "Rami Sayar",
</span>    <span>"email": ""
</span>  <span>},
</span>  <span>"dependencies": {
</span>    <span>"express": "3.4.4",
</span>    <span>"jade": "*",
</span>    <span>"socket.io": "^1.0.6",
</span>    <span>"stylus": "*"
</span>  <span>}
</span><span>}</span>
登入後複製
登入後複製
登入後複製

要為用戶斷開連接時做同樣的事情,我們必須連接每個插座的斷開事件。在上一個代碼塊的控制台日誌之後,在內部添加以下代碼。

>
<span>npm install --save socket.io</span>
登入後複製
登入後複製
登入後複製

>最後,代碼看起來像這樣:

>
http<span>.createServer(app).listen(app.get('port'), function(){
</span>  <span>console.log('Express server listening on port ' + app.get('port'));
</span><span>});</span>
登入後複製
登入後複製
登入後複製

>廣播在聊天頻道上收到的消息

>

> socket.io為我們提供了一個稱為emit的函數以發送事件。 >

在聊天頻道上收到的任何消息都將通過回調中的廣播標誌調用EMIT。

>最後,代碼看起來像這樣:
<span>var serve = http.createServer(app);
</span><span>var io = require('socket.io')(serve);
</span>
serve<span>.listen(app.get('port'), function() {
</span>    <span>console.log('Express server listening on port ' + app.get('port'));
</span><span>});</span>
登入後複製
登入後複製
>

>將消息保存到NOSQL數據庫
io<span>.on('connection', function (socket) {
</span>    <span>console.log('a user connected');
</span><span>});</span>
登入後複製

>聊天室應將聊天消息保存到簡單的數據存儲中。通常,有兩種方法可以保存到節點中的數據庫。您可以使用特定於數據庫的驅動程序,也可以使用ORM。在本教程中,我將向您展示如何將消息保存到MongoDB。當然,您可以使用您喜歡的任何其他數據庫,包括postgresql或mysql等SQL數據庫。

>您應該確保您有一個可以連接到的mongodb。您可以使用第三方服務來託管MongoDB,例如Mongohq或Mongolab。看看本教程,以查看如何使用Azure中的蒙古插件創建MongoDB。當您到達“創建應用程序”部分時,您可以停止閱讀,只需確保在以後可以輕鬆訪問的Mongolab_uri。

>創建了一個mongoDB後,您將擁有數據庫的mongolab_uri - 在您已復製到剪貼板的連接信息下,您將需要確保URI可用於應用程序。在源代碼管理工具中,將諸如此URI之類的敏感信息(例如此URI)或配置文件中添加到最佳實踐。您可以在Azure Web應用程序的“配置”菜單(例如在您使用的教程中)中將值添加到連接字符串列表中,也可以將其添加到應用程序設置列表中(帶有uname customConnstr_mongolab_uri)。在本地計算機上,您可以將其添加到環境變量中,名稱customconnstr_mongolab_uri和uri的值。

下一步是在我們的項目中增加對MongoDB的支持。您可以通過將以下行添加到package.json中的依賴項對像中來做到這一點。確保將您的更改保存到文件中。

在解決方案資源管理器中,在項目的NPM部分上右鍵單擊右鍵單擊,以顯示右鍵單擊上下文菜單。單擊內容菜單中的“安裝丟失的軟件包”以安裝MongoDB軟件包,以便可以用作模塊。

我們希望導入該模塊,以便能夠在app.js中使用mongoDB client對象。您可以在第一個需要('')函數調用(例如在第11行)之後添加以下代碼行。
<span>{
</span>  <span>"name": "NodeChatroom",
</span>  <span>"version": "0.0.0",
</span>  <span>"description": "NodeChatroom",
</span>  <span>"main": "app.js",
</span>  <span>"author": {
</span>    <span>"name": "Rami Sayar",
</span>    <span>"email": ""
</span>  <span>},
</span>  <span>"dependencies": {
</span>    <span>"express": "3.4.4",
</span>    <span>"jade": "*",
</span>    <span>"socket.io": "^1.0.6",
</span>    <span>"stylus": "*"
</span>  <span>}
</span><span>}</span>
登入後複製
登入後複製
登入後複製

我們希望使用我們在customConnstr_mongolab_uri環境變量中使用的URI連接到數據庫。連接後,我們想插入插座連接中收到的聊天消息。

>
<span>npm install --save socket.io</span>
登入後複製
登入後複製
登入後複製
如您在上面的代碼中所看到的,我們使用process.env對象獲取環境變量值。我們進入數據庫中的集合,並將其稱為插入函數,並使用對像中的內容。

現在,每條消息都將保存到我們的MongoDB數據庫中。 >

發射最後10條消息

>當然,我們不希望我們的用戶在加入聊天室後會感到迷失,因此我們應該確保將接收到的最後10條消息發送到服務器,因此至少我們可以給他們一些上下文。為此,我們需要連接mongodb。在這種情況下,我避免將所有套接字代碼與數據庫的一個連接包裝,以便我仍然可以使服務器運行,即使它丟失了數據庫連接。

>我們還需要將我的查詢分類並將我的查詢限制為最後10條消息,因為它包含時間戳,我們將使用MongoDB生成的_id(儘管在更可擴展的情況下,您將需要在聊天消息中創建一個專用時間戳),我們將限制函數調用以將結果限制在10條消息中。

>

>我們將從MongoDB中流式傳輸結果,以便我可以在它們到達時盡快將其發射到聊天室中。

上面的代碼可以按照上一段中的解釋來完成該作業。

>部署到Azure

http<span>.createServer(app).listen(app.get('port'), function(){
</span>  <span>console.log('Express server listening on port ' + app.get('port'));
</span><span>});</span>
登入後複製
登入後複製
登入後複製
>您可以按照過去的教程(例如第2部分)重新部署Azure。

結論

總而言之,我們有一個聊天系統,能夠向所有其他連接的客戶端廣播通過Websocket收到的消息。該系統將消息保存到數據庫並檢索最後10條消息,以向連接聊天室的每個新用戶提供上下文。

敬請期待第4部分!

>

第4部分 - 在這裡構建使用Bootstrap的聊天室UI。您可以按照我的Twitter帳戶來保持最新和其他文章的最新信息。

在Azure

上進行節點的更多學習

要在節點上進行更多深入學習,我的課程可在Microsoft Virtual Academy上找到。

或類似節點主題上的一些較短的格式視頻:>

六部分系列:用node.js

構建應用程序

漫步在節點(coding4fun)

  • 本文是Microsoft的Web Dev技術系列的一部分。我們很高興與您共享Spartan項目及其新的渲染引擎。在Modern.ie

  • 經常詢問有關構建node.js供電的聊天室網絡應用程序的問題(常見問題解答)

    >如何確保使用Node.js,MongoDB和Socket.io?

    安全性構建的Chatroom Web應用程序的安全性是任何Web應用程序的重要方面。對於使用node.js,mongodb和socket.io構建的聊天室Web應用程序,您可以實施多種安全措施。首先,使用HTTP而不是HTTP來確保您的服務器和客戶端之間的所有通信都已加密。其次,驗證所有傳入數據以防止SQL注入攻擊。第三,使用JWT(JSON Web令牌)進行用戶身份驗證。最後,定期將您的所有依賴項更新到其最新版本,以避免潛在的安全漏洞。

    我可以將其他數據庫與node.js集成在一起的聊天室Web應用程序?高度靈活,可以與各種數據庫集成。儘管MongoDB是由於其可伸縮性和靈活性而是一種流行的選擇,但您也可以根據您的特定需求使用其他數據庫,例如MySQL,PostgreSQL或SQLITE。數據庫的選擇在很大程度上取決於您應用程序的數據要求和數據庫的特定功能。

    >如何縮放我的node.js chatroom Web應用程序來處理更多用戶? node.js聊天室網絡應用程序,您可以使用負載平衡器在多個服務器上分發傳入的流量。您還可以使用node.js中的聚類模塊來創建所有共享服務器端口的子進程。此外,請考慮使用MongoDB等NOSQL數據庫,該數據庫可以輕鬆地進行水平擴展以處理更多數據。

    >

    我可以將其他實時技術而不是socket.io用於我的Chatroom Web應用程序? >是的,您可以使用其他幾種實時技術,而不是socket.io。其中包括Websocket,服務器範圍事件(SSE)以及Pusher或Firebase(例如Pusher或Firebase)的第三方服務。這些技術中的每一個都有其自己的優點和劣勢,因此選擇取決於您的特定需求。

    >

    >我如何測試我的node.js聊天室Web應用程序以確保其正常工作?是開發過程的重要組成部分。對於Node.js聊天室Web應用程序,您可以使用Mocha或Jest等測試框架編寫單元測試和集成測試。您還可以使用郵遞員或失眠等工具進行API測試。此外,請考慮使用柏樹或木偶等端到端測試工具模擬用戶交互並確保您的應用程序按預期工作。

    >如何將我的node.js聊天室Web應用程序部署到實時服務器? >有幾個平台可讓您部署Node.js Chatroom Web應用程序。其中包括Heroku,AWS,Google Cloud和Azure。每個平台都有其自己的部署過程,但是通常,您需要創建一個帳戶,設置一個新項目並遵循平台的說明以部署您的應用程序。

    >我可以在我的Node.js Chatroom Web應用程序中添加多媒體支持嗎?這可以通過集成Cloudinary或AWS S3(以存儲和檢索多媒體文件)等第三方服務或AWS S3來完成。您還可以使用socket.io實時發送和接收多媒體數據。

    >如何將用戶身份驗證添加到我的node.js chatroom web應用程序?

    任何聊天室網絡應用程序的功能。對於Node.js應用程序,您可以使用Passport.js,Passport.js是處理用戶身份驗證的流行中間件。它支持各種身份驗證策略,包括本地用戶名和密碼,Oauth和JWT。

    >我可以將其他前端框架與node.js一起使用我的聊天室Web應用程序?是後端技術,可以與任何前端框架或庫一起使用。雖然教程使用普通的HTML和CSS,但您可以使用React,Angular或Vue.js(例如React,Angular或vue.js)來構建更複雜和交互式的用戶界面。

    >

    >我如何處理Node.js Chatroom Web中的錯誤App?

    錯誤處理是任何Web應用程序的重要組成部分。在Node.js中,您可以使用中間件處理錯誤。這涉及創建一個有四個參數的特殊功能:錯誤,請求,響應等。然後,您可以使用此函數記錄錯誤,向客戶端發送錯誤響應,甚至將用戶重定向到錯誤頁面。

以上是構建一個node.js供電的聊天室網絡應用:節點,mongodb和套接字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板