2015-03-29 13 views
9

Sto cercando di creare un API di nodo davvero semplice utilizzando express.js 4 ma ho bisogno di alcuni eventi "in tempo reale" per i quali ho aggiunto socket.io. Sono abbastanza nuovo per entrambi, quindi mi mancherà probabilmente qualcosa di semplice ma non riesco a trovare buoni documenti/tut su questo.express.js 4 e prese con router express

Nell'app express (creata con il generatore di espressioni) ho qualcosa del genere basato su semplici esempi e documenti di progetto che ho letto. Questo funziona OK e dalle applicazioni client, posso inviare/ricevere gli eventi di socket:

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; 

ma voglio utilizzare le prese dai miei percorsi API (nel file ./routes/api.js che richiedono' ' sopra). Ad esempio, qualcuno potrebbe utilizzare l'API per PUT/POST una risorsa e voglio trasmetterla ai client socket.io connessi.

Non riesco a vedere come utilizzare la variabile 'io' o organizzare il codice attualmente nella funzione io.sockets.on('connection' ... all'interno di percorsi espressi. Ecco il file ./routes/api.js:

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; 

risposta

8

Ho modificato i file un po ', che tu possa controllare se funziona?

È possibile passare l'io definito ai percorsi come di seguito;

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

non ho la prova le parti Socket.IO ma non c'è errore di sintassi e percorsi anche lavorando.

file di server.js:

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

Grazie Caner. Questo funziona e con un paio di modifiche minori che potrei usare in quanto questa particolare app è abbastanza semplice. Ma mentre sto cercando di usarlo per imparare alcune buone pratiche, c'è un modo per continuare a usare il router espresso()? Questo sembra essere il modo idiomatico di esprimere 4.x. – darrend

+0

@darrend, in base ai documenti express.js sembra sia giusto usare come http://expressjs.com/api.html, cosa ne pensi? – cdagli

+0

È ragionevole - Contrassegnerò come accettato e analizzerò i documenti e ne scriverò altri. Grazie per l'aiuto. – darrend

14

Una possibilità è quella di passarlo a oggetto req.

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

hai effettivamente ottenuto il codice sopra riportato per funzionare? l'io sulla mia richiesta continua a essere visualizzato come indefinito nel mio codice del router – atsituab

+0

ups ho avuto un errore lì - la parte '// Make io accessibile al nostro router' dovrebbe essere definita prima di' app.use ('/ api', api); ' – platlas

Problemi correlati