2015-03-29 9 views
9

Ich versuche, eine wirklich einfache Knoten-API mit express.js 4 zu erstellen, aber ich brauche ein paar "Echtzeit" Ereignisse, für die ich socket.io hinzugefügt. Ich bin zu beiden ziemlich neu, also verpasse ich wahrscheinlich etwas Grundlegendes, aber ich kann nicht gute Dokumente/Tuts auf diesem finden.express.js 4 und Sockets mit Express-Router

In der Express-App (erstellt mit dem Express-Generator) habe ich so etwas basierend auf einfachen Beispielen und Projektdokumenten, die ich gelesen habe. Dies funktioniert OK und von Client-Anwendungen, kann ich senden/empfangen die Socket-Ereignisse:

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var api = require('./routes/api'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/api', api); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 


// error handlers omitted 

module.exports = app; 

aber ich möchte die Steckdosen von meiner API Routen benutzen (in der ./routes/api.js-Datei, die ich benötigen ' über). Zum Beispiel könnte jemand die API verwenden, um eine Ressource PUT/POST zu verwenden, und ich möchte diese Übertragung an verbundene socket.io-Clients senden.

Ich kann nicht sehen, wie man die Variable 'io' verwendet oder den Code, der derzeit in der io.sockets.on('connection' ... Funktion innerhalb Express-Routen ist, organisiert. Hier ist die ./routes/api.js Datei:

var express = require('express'); 
var router = express.Router(); 
var io = ???; 

router.put('/foo', function(req, res) { 
    /* 
     do stuff to update the foo resource 
     ... 
    */ 

    // now broadcast the updated foo.. 
    io.sockets.emit('update', foo); // how? 
}); 

module.exports = router; 

Antwort

8

Ich habe Ihre Dateien ein wenig verändert, können Sie überprüfen, ob es funktioniert?

Sie können das von Ihnen definierte io wie unten beschrieben an Ihre Routen übergeben.

Ich habe die Socket.IO-Teile nicht getestet, aber es gibt keine Syntaxfehler und Routen funktioniert auch.

server.js Datei:

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var logger = require('morgan'); 

var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
    io.sockets.emit('message', data); 
}); 
}); 

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

console.log("Server listening at port 3000"); 

api.js:

module.exports = function(app,io) { 
app.put('/foo', function(req, res) { 

    /* 

     do stuff to update the foo resource 

     ... 

    */ 


    // now broadcast the updated foo.. 

    console.log("PUT OK!"); 

    io.sockets.emit('update'); // how? 
    res.json({result: "update sent over IO"}); 

}); 
} 
+1

Dank Caner. Das funktioniert und mit ein paar kleineren Verbesserungen könnte ich das verwenden, da diese bestimmte App ziemlich einfach ist. Aber wenn ich versuche, es zu verwenden, um einige Best Practices zu lernen, gibt es eine Möglichkeit, den Express-Router() weiter zu verwenden? Das scheint der idiomatische Weg zu sein, Express 4.x zu verwenden. – darrend

+0

@darrend, laut express.js Dokumente sieht es so aus, dass es in Ordnung ist, das zu benutzen http://expressjs.com/api.html, was denkst du? – cdagli

+0

Es ist vernünftig - ich werde als akzeptiert markieren und in die Dokumente eintauchen und noch mehr programmieren. Danke für die Hilfe. – darrend

14

Eine Option ist es erf Objekt um einen Pass zu spielen.

app.js:

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var api = require('./routes/api'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 

// Make io accessible to our router 
app.use(function(req,res,next){ 
    req.io = io; 
    next(); 
}); 

app.use('/api', api); 

// error handlers omitted 

module.exports = app; 

./routes/api.js:

var express = require('express'); 
var router = express.Router(); 

router.put('/foo', function(req, res) { 
    /* 
     do stuff to update the foo resource 
     ... 
    */ 

    // now broadcast the updated foo.. 
    req.io.sockets.emit('update', foo); 
}); 

module.exports = router; 
+0

hast du tatsächlich den obigen Code zu arbeiten? das io auf meiner Anfrage bleibt als undefined in meinem Router-Code – atsituab

+0

ups Ich hatte einen Fehler dort - der Teil '// Make io zugänglich für unseren Router' sollte vor' app.use ('/ api', api) definiert werden; ' – platlas