express4+Socket.io的封裝問(wèn)題

閱讀本文前……

建議訪問(wèn)http://socket.io/get-started/chat/先大致了解如何構(gòu)建一個(gè)基于Node.js+express+socket.io的簡(jiǎn)易聊天室之后再閱讀本文。

最近做網(wǎng)絡(luò)項(xiàng)目開(kāi)發(fā)的時(shí)候需要使用到Socket.io,網(wǎng)站使用的是express4搭建的。如何將和Socket.io相關(guān)的代碼分離,網(wǎng)上的資料比較少,http://socket.io/get-started/chat/這個(gè)頁(yè)面上的樣例將所有代碼混雜在一起,并不適合在開(kāi)發(fā)中使用。我在這里先提供一個(gè)思路。

待解決的問(wèn)題

  • Socket.io的配置代碼如何從express自動(dòng)生成項(xiàng)目中分離
  • 支持Socket.io的功能插件如何從Socket.io的配置代碼中分離

首先用express-generator生成express4項(xiàng)目。并且用npm在項(xiàng)目中安裝socket.io。項(xiàng)目文件夾的結(jié)構(gòu)如下

bin/
  www
model/
  chatcore.js
node_modules/
public/
routes/
  index.js
views/
  chatroom/
    chat.pug
app.js
socketio.js
package.js

Socket.io的封裝

第一步,新建socketio.js,將socketio相關(guān)配置寫(xiě)入

// socketio.js
var socketio = {};
var socket_io = require('socket.io');

//獲取io
socketio.getSocketio = function(server){
  var io = socket_io.listen(server);
};

module.exports = socketio;

第二步,修改bin/www,啟動(dòng)服務(wù)器端服務(wù)

// bin/www
/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('chatroom:server');
var http = require('http');
// 添加此段內(nèi)容以引入socketio
var io = require('../socketio');
// ...

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

// 添加此段內(nèi)容啟動(dòng) Socket.io
io.getSocketio(server);

// ...

此時(shí)前端頁(yè)面可從http://localhost:3000/socket.io/socket.io.js加載前端部分的socketio代碼,前端內(nèi)容可以參照http://socket.io/get-started/chat/創(chuàng)建。

啟動(dòng)基于Socket.io的服務(wù)(以聊天室為例)

這里只講解后臺(tái)部分的代碼。
假如我們需要啟動(dòng)一個(gè)簡(jiǎn)易聊天室服務(wù),我們可以把聊天室的業(yè)務(wù)放在socketio.js當(dāng)中(雖然這不是一個(gè)好主意):

// socketio.js
var socketio = {};
var socket_io = require('socket.io');

//獲取io
socketio.getSocketio = function(server){
  var io = socket_io.listen(server);

  // 聊天室 
  // 從http://socket.io/get-started/chat/上尋求更多幫助
  io.on('connection', function(socket) {
    console.log('a user connected');
    socket.on('chat message', function(msg){
      io.emit('chat message', msg);
    });
    socket.on('disconnect', function(){
      console.log('user disconnected');
    });
  });
};

module.exports = socketio;

分離聊天室業(yè)務(wù)和socket.io配置

下面將聊天室業(yè)務(wù)代碼分離,在model/(如果沒(méi)有的話(huà)就新建一個(gè))下創(chuàng)建chatcore.js,并加入如下內(nèi)容:

// model/chatcore.js
var chatcore = {};

/**
 * chatroom app
 */
chatcore.init = function(io) {
  io.on('connection', function(socket) {
    console.log('a user connected');
    socket.on('chat message', function(msg){
      io.emit('chat message', msg);
    });
    socket.on('disconnect', function(){
      console.log('user disconnected');
    });
  });
};

module.exports = chatcore;

socketio.js修改為:

// socketio.js
var socketio = {};
var socket_io = require('socket.io');
var chatcore = require('./model/chatcore');

//獲取io
socketio.getSocketio = function(server){
  var io = socket_io.listen(server);
  // Start chatroom app
  chatcore.init(io);
};

module.exports = socketio;

如果有更多的應(yīng)用模塊,可以以相同的方式安排代碼。

歡迎討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容