2017-03-17 113 views
0

我已經看到了一些引用此問題的問題,但無法使其正常工作。將socket.io事件邏輯分離到模塊中

我有一個應用程序運行快速API API路由以及套接字實時應用程序。

我想保持我的server.js文件「乾淨」,並將所有與套接字相關的事件放在一個單獨的文件中。我也希望能夠從我的路線文件中激發一個事件。

我server.js loks這樣的:

const dotenv = require('dotenv/config'); 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const socketIO = require('socket.io'); 
var http = require('http'); 
const _ = require('lodash'); 
const path = require('path'); 
const publicPath = path.join(__dirname, '../public'); 


var {mongoose} = require('./db/mongoose'); 
var {ObjectID} = require('mongodb'); 
var {authenticate} = require('./middleware/authenticate'); 
var {socketEvents} = require('./middleware/socketEvents')(io); 
var multiparty = require('connect-multiparty'), 
    multipartyMiddleware = multiparty(); 

var app = express() 
var serv = require('http').createServer(app) 
var io = socketIO.listen(serv) 


var PORT = process.env.PORT || '80'; 
app.use(bodyParser.json()); 
app.use(multipartyMiddleware); 
app.use(express.static(publicPath)); 


serv.listen(PORT,() => { 
    console.log('Started on port: ' + PORT); 
}); 

module.exports = { 
    app 
}; 

我想有包括socketEvents.js文件:

io.on('connection', (socket) => { 
    console.log('New user connected'); 

//all socket events here 

}); 

我怎樣才能做到這一點?

回答

0

您可以測試以下模式:

server.js

'use strict'; 
const io = require('socket.io')(3000); 
const io_logic = require('./socketEvents')(io); 
console.log('socket.io server started at port 3000'); 

socketEvents.js

function socket_events (io) { 
    io.on('connection', function (socket) { 
      console.log('a client has connected'); 
    }); 
} 
module.exports = socket_events; 
+0

我想運行兩個插座服務器以及快遞API在航線端口80.在您的示例代碼中,套接字服務器正在端口3000上運行。如何在同一端口上運行這兩個端口。如果我從const io = require('socket.io')(3000);運行「TypeError:io.on不是函數」時出現錯誤,謝謝 – dwax

+0

好的 - 所以我設法讓兩臺服務器都運行,但現在我的客戶端抱怨它找不到socket.io.js文件 - 從另一個位置加載時路徑是否移動?我如何確定文件的正確路徑? – dwax