2014-05-11 5 views
6

Ich habe eine Kopie des letzten Mean.io geholt und eine ganze Reihe von Änderungen im Vergleich zu der vorherigen Version, mit der ich vorher gearbeitet habe, festgestellt. Nun, was ich mache, ist eine sehr einfache Chat-Anwendung, die socket.io mit Räumen verwendet. Nach der grundlegenden Einrichtung in der Socket-Dokumentation muss ich folgendes implementieren:Wie benutze socket.io mit der neuesten 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); 
    }); 
}); 

Wo würde ich die Grundeinstellung des Socket-Raums definieren?

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

Antwort

9

können Sie die socket.io setzen auf Ihrem Server auf hören

/server/config/system/bootstrap.js 

erfordern die socket.io Modul

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

nun die socket.io gesetzt hört auf App

Dann brauchen Sie d, um das socket.io-Objekt in der bootstrapDependencies() -Funktion in Ihre App zu injizieren.

function bootstrapDependencies() { 
    ... 

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

Mean.uses dieses Projekt für seine Dependency Injection https://www.npmjs.org/package/dependable

Schließlich müssen Sie Ihre App konfigurieren, die auf alle Socket-Verbindungen hören wahrscheinlich wollen Sie diese auf Ihrem Haupt-App-Router tun bei

/server/routes/index.js 

Beispielverbindungshandhabungs

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); 
    }); 
}); 

Und noch wichtiger, vergessen Sie nicht, socket.io auf der Clientseite einzurichten.

// on '/server/views/includes/foot.html' 
<script src='/socket.io/socket.io.js'></script> 
<script> 
    var socket = io(); 
</script> 
0

Das neueste Update v0.4.0 erfordert eine andere Strategie, um socket.io-Setup zu erhalten. Ich bin zur Zeit mit einem der Projektmitarbeiter im Gespräch, um meine Lösung zu validieren. Ich werde sicherstellen, dass meine Antwort aktualisiert wird, sobald ich mir 100% sicher bin.

Das Meanio-Paket befindet sich jetzt auch in der Bootstrap-Funktion, von wo aus das Express-Setup aufgerufen wird.

+3

Gibt es ein Update dafür, oder stellen Sie immer noch sicher, dass es vollständig funktioniert? Danke übrigens! –

+0

Ich bin auch interessiert zu sehen, ob es Arbeit gibt. –

+0

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

0

Sieht so aus, als hätten die mean.io-Jungs kürzlich eine offizielle Socket.io-Implementierung veröffentlicht, die direkt in ihren Stack integriert ist. Überprüfen Sie es on Github.

1

Ich habe gerade auf einen anderen SO Post geantwortet (Mean.io framwork with socket.io).

Hinweis: Ich verwende mean.io v0.5.26 und socket.io v1.1.0.

Meine Antwort hier wieder einfügen.


Ich hatte auch das gleiche Problem und nahm mich etwa eine Woche, um es endlich richtig zu machen.Ich werde versuchen zu erklären, was ich getan habe:

In dieser Datei app.js rufe ich nur den Code, dann übergeben wird, für mich ein socket.io Objekt einrichtet erzeugt und die das Routenmodul.

'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

Diese Datei einfach konfiguriert das socket.io Objekt. Bitte beachten Sie, dass ich für diese Arbeit das mainio Modul auf Version 0.5.26 upgraden musste, da http Objekt (Express Server) in älteren meanio Versionen nicht verfügbar ist. Wenn Sie ssl verwenden möchten, können Sie außerdem https anstelle von http injizieren.

'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; 
}; 

Routen/chat.js

Schließlich verwenden die Routen-Datei die Socket-Ereignisse definieren usw.

'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) { 

     }); 
    }); 
}; 

hoffe, das hilft!

+0

Ich wollte nur hinzufügen, dass dieser Code endlich in die offizielle Mean-Socket-Implementierung umgesetzt wurde. Also, schau es dir an! Und es löst auch das Problem der Bereitstellung von Meanio und Mean-Socket hinter einem einzelnen Port, der früher nicht unterstützt wurde. – Digitrance

+0

In der neuesten Version wegen Cluster nicht im Produktionsmodus arbeiten. –