2017-06-22 4 views
0

Entweder habe ich ein grundlegendes Missverständnis, wie socket.io funktioniert (sehr wahrscheinlich), oder ich finde nur einige Fehler, die niemand kennt (fast unmöglich).Socket.io mit Express, emittieren nicht funktioniert in Express-Route

Ich habe versucht, Express mit socket.io zu integrieren. Auf der Client-Seite funktioniert alles gut: Der Benutzer klickt auf die Schaltfläche, das Ereignis wird ausgegeben, alle sind zufrieden.

Nehmen wir an, ich möchte dieses Ereignis innerhalb einer Expressroute ausgeben, bevor eine Seite gerendert wird. Das Ereignis scheint nie ausgestrahlt zu werden. Aus all den Fragen, die ich mir angeschaut habe, soll ich meine "io" -Instanz einfach in meine App einstecken und dann über meine Routen darauf zugreifen können.

Das ist also mein Setup ...

// index.js

var app = express(); 
var port = process.env.PORT || 3700 

var io = require('socket.io').listen(app.listen(port)); 
io.on('connection', function (socket) { 
    console.log("Socket connected on port " + port) 

    socket.on('send', function (data) { 
     console.log("WAFFLES") 
    }); 
}); 
console.log('The magic happens on port ' + port); 

require('./app/routes.js')(app, io); 

// app/routes.js

module.exports = function(app, io){ 

    app.get('/', function(req, res){ 

    io.on('connection', function (socket) { 
     console.log("Hello from the route!") 
     socket.emit('send', {message: 'urdum'}) 
    }); 

    res.render('index') 
    }) 
} 

So in diesem Fall möchte ich in der Lage sein, in die/route zu gehen, siehe "Hallo von der Route" und dann "WAFFLES", die nach dem Auslösen des "send" -Ereignisses in der Konsole protokolliert wurden. Stattdessen bekomme ich absolut nichts.

Ich habe versucht, "io" über app.set ('socketio', io) zu übergeben. Aber egal was, nichts funktioniert.

ich die Veranstaltung auch versucht haben, ohne die io.on innerhalb der Route emittierenden ('Verbindung') und einfach nur tun,

io.emit('send' ...) 

ODER

io.sockets.emit('send' ...) 

Antwort

1

Ich habe eine grundlegende Missverständnis, wie socket.io funktioniert (sehr wahrscheinlich)

Sie haben Recht,

Diese typische Einstellung für Socket-io ist, lesen Sie mehr in https://socket.io/docs/

// index.js 

var express = require('express'); 
var socketio = require('socket.io'); 
var http = http = require('http'); 
var app = express(); 

// Attach Socket.io 
var server = http.createServer(app); 
var io = socketio.listen(server); 
app.set('socketio', io); // <-- bind socket to app 
app.set('server', server); // <-- optional 
io.on('connection', function (socket) { 
    console.log("Socket connected on port " + port); 
}); 
app.listen(3000); 
server.listen(3001) // <-- socket port 
// app.get('server').listen(3001); // <-- use server or app.get('server') 

In Ihrem Router, Access-Buchse von req.app.get('socketio');

// app/routes.js 
module.exports = function(app, io){ 

    app.get('/', function(req, res){ 
    var socketio = req.app.get('socketio'); 

    socketio.emit('send', {message: 'urdum'}); 

    res.render('index') 
    }) 
} 
Verwandte Themen