2014-05-11 14 views
6

Ho preso una copia dell'ultimo Mean.io e ho notato un certo numero di modifiche rispetto alla versione precedente con cui ho lavorato in precedenza. Ora, quello che sto facendo è creare un'applicazione di chat molto semplice che utilizza socket.io con stanze. Dopo la configurazione di base nella documentazione Socket devo implementare la seguente:Come usare socket.io con l'ultimo mean.io?

var app = require('express')() 
    , server = require('http').createServer(app) 
    , io = require('socket.io').listen(server); 

server.listen(80); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

Dove dovrei definire la configurazione di base stanza presa?

socket.set("log level", 1); 
var people = {}; 
var rooms = {}; 
var clients = []; 

risposta

9

È possibile impostare il socket.io di ascoltare sul vostro server su

/server/config/system/bootstrap.js 

necessario il modulo socket.io

var express = require('express'), 
    appPath = process.cwd(), 
    io  = require('socket.io'); 

Ora impostare il socket.io di ascoltare sul vostro app

// Express settings 
var app = express(); 
require(appPath + '/server/config/express')(app, passport, db); 
io = io(app.listen(3000));  

return io; 

Quindi nee d per iniettare l'oggetto socket.io nella tua app sulla funzione bootstrapDependencies().

function bootstrapDependencies() { 
    ... 

    // Register socket.io dependency 
    mean.register('io', function() { 
     return io; 
    }); 
} 

Mean.uses questo progetto per la sua iniezione di dipendenza https://www.npmjs.org/package/dependable

Infine è necessario configurare la vostra applicazione per l'ascolto su ogni connessioni socket probabilmente avrete bisogno di fare queste sul router della vostra applicazione principale a

/server/routes/index.js 

gestore collegamento Esempio

var io = require('meanio').io; 

io.on('connection', function (socket) { 
    // emit data to the clients 
    socket.emit('news', { hello: 'world' }); 

    // event listeners 
    socket.on('my other event', function (data) { 
     // call your controller function here 
     Controller.action(data); 
    }); 
}); 

E, soprattutto, non dimenticare di installare socket.io sul lato client.

0

L'ultimo aggiornamento v0.4.0 richiede un'altra strategia per ottenere l'installazione di socket.io. Sono attualmente in discussione con uno dei contributori del progetto per convalidare la mia soluzione. Mi assicurerò di aggiornare la mia risposta una volta che sono sicuro al 100%.

Il pacchetto meanio è ora dove si trova anche la funzionalità di bootstrap, da cui viene chiamata la configurazione rapida.

+3

C'è qualche aggiornamento per questo, o stai ancora facendo in modo che funzioni completamente? Grazie, a proposito! –

+0

Sono anche interessato a vedere se c'è un problema. –

+0

Avanzamento: http://www.reddit.com/r/node/comments/29pr64/how_to_combine_meanio_and_socketio/ ... –

0

Sembra che i media.io abbiano recentemente rilasciato un'implementazione ufficiale Socket.io che si integra direttamente con il loro stack. Dategli un'occhiata on Github.

1

Ho appena risposto a un altro post SO (Mean.io framwork with socket.io).

Nota: Sto utilizzando mean.io v0.5.26 e socket.io v1.1.0.

Incollare di nuovo la risposta, qui.


Ho anche affrontato lo stesso problema e mi ci sono voluti circa una settimana per riuscire finalmente a farlo bene.Cercherò di spiegare quello che ho fatto:

app.js

In questo file, ho appena invoco il codice che crea e imposta un oggetto socket.io per me, che viene poi passato a il modulo rotte.

'use strict'; 

/* 
* Defining the Package 
*/ 
var Module = require('meanio').Module; 

var MeanSocket = new Module('chat'); 

/* 
* All MEAN packages require registration 
* Dependency injection is used to define required modules 
*/ 
MeanSocket.register(function(app, http) { 

    var io = require('./server/config/socketio')(http); 

    //We enable routing. By default the Package Object is passed to the routes 
    MeanSocket.routes(io); 

    return MeanSocket; 
}); 

server/config/socketio.js

Questo file configura semplicemente l'oggetto socket.io. Si prega di notare che ho dovuto aggiornare il modulo meanio alla versione 0.5.26 per questo lavoro, poiché l'oggetto http (express server) non è disponibile nelle versioni medio di meanio. Inoltre, nel caso in cui si desideri utilizzare ssl, è possibile iniettare https anziché http.

'use strict'; 

var config = require('meanio').loadConfig(), 
    cookie = require('cookie'), 
    cookieParser = require('cookie-parser'), 
    socketio = require('socket.io'); 

module.exports = function(http) { 

    var io = socketio.listen(http); 

    io.use(function(socket, next) { 
     var data = socket.request; 

     if (!data.headers.cookie) { 
      return next(new Error('No cookie transmitted.')); 
     } 

     var parsedCookie = cookie.parse(data.headers.cookie); 
     var sessionID = parsedCookie[config.sessionName]; 
     var parsedSessionID = cookieParser.signedCookie(parsedCookie[config.sessionName], config.sessionSecret); 

     if (sessionID === parsedSessionID) { 
      return next(new Error('Cookie is invalid.')); 
     } 

     next(); 
    }); 

    return io; 
}; 

percorsi/Chat.js

Infine, utilizzare il file percorsi per definire gli eventi di socket, ecc

'use strict'; 

// The Package is passed automatically as first parameter 
module.exports = function(MeanSocket, io) { 

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

     console.log('Client Connected'); 

     socket.on('authenticate', function(data, callback) { 

     }); 
    }); 
}; 

Spero che questo aiuti!

+0

Volevo solo aggiungere che questo codice è stato finalmente trasformato nell'implementazione ufficiale della presa di corrente. Quindi, controlla! Inoltre, risolve il problema della distribuzione di meanio e mean-socket dietro una singola porta, che non era supportata in precedenza. – Digitrance

+0

Non funziona in modalità produzione nella versione più recente a causa di cluster .. –