2017-08-24 91 views
1

我一直在使用socket.io構建一個簡單的基於Node/Express的聊天客戶端,並且在添加依賴項與使用閉包將依賴項傳遞給組件的導入方式之間存在一些混淆。Node.js體系結構和應用程序結構

這裏是應用程序是如何構成的:

  • index.js
  • 服務器/ server.js(創建Express實例)
  • 服務器/控制器/(包含需要socketIO客戶端控制器)
  • 服務器/ store.js(創建Redis的實例)
  • 服務器/ websocket.js(創建socket.io實例/返回一個自定義的API)

創建一個socketIO客戶端需要一個express.Server實例。 但是,我仍然需要在Express服務器的控制器中使用socketIO客戶端API(發送/廣播更新)。 因此,套接字客戶端由index.js作爲承諾輸出,在解析時用於設置控制器以進行快速處理。

問: 什麼是掛鉤組件的好辦法,其中

  • 組件A需要組件B.
  • 組分B中的一些方法的一個實例,將需要組件A. 的一個實例(這裏SocketIO需要Express實例,但我還需要一個正在使用的快遞在控制器SocketIO客戶端)

的實際代碼: https://github.com/vsr4493/chatbox

+1

我投票結束這個問題作爲題外話題,因爲它是關於代碼審查。 –

回答

0

在Node.js生態系統中,不存在構建項目組件的首選方法,特別是對於不同的業務案例。

我已經實現了一個類似的Web應用程序,需要在快遞控制器中使用socket.io實例,並且有同樣的問題:'我應該如何在控制器中訪問socket對象?'。

我所做的是用socket事件替換我的express控制器。因此,您的代碼庫可以變成以下代碼:

io.on('connection', function(socket){ 

    socket.on('join', function(user) { 
     userStore.join(user) 
     emitOnlineCount() 
    }) 

    function emitOnlineCount() { 
     io.sockets.emit("onlines", userStore.getUsers().length) 
    } 

}) 

保持您的代碼清潔和簡單,在您的手中。