ExpressJS - Prise.IO avec la Route de Séparation
Je vais essayer d'obtenir ma tête autour de ExpressJS et de la Prise.IO. J'ai mes itinéraires dans un fichier séparé que j'inclus à partir de mon app.js:
var express = require('express')
, db = require('./db')
, mongoose = require('mongoose')
, models = require('./models/device')
, http = require('http')
, path = require('path')
, app = express()
, server = http.createServer(app)
, io = require('socket.io').listen(server)
, routes = require('./routes/myRoutes');
Cependant lorsque je l'ai essayer et émettent un événement à partir d'une de mes routes je n'ai pas de référence à la prise.io.
exports.update = function(req, res){
return Item.findById(req.params.id, function(err, item) {
//Do some checks and save.
socket.emit('updated');
}
}
Je comprends pourquoi cela pourrait ne pas être disponible. Plutôt je ne comprends pas quelle est la meilleure façon d'obtenir une poignée sur la socket.io est à partir d'un autre fichier autre que app.js. Je regardais cette question (voir Ricardo réponse), mais je ne suis toujours pas clair. Idéalement, je voudrais éviter de le faire:
itinéraires = nécessite("routes/myRoutes")(io);
- vous pouvez éviter d'utiliser le module http, bien que prise.io besoin d'un serveur http, vous pouvez appeler à partir de l'express de dépendance (3.x.x) donc: var app = express(), serveur = app.écouter(3000), io = socket.écouter(serveur);
- Mise à jour: Prendre un coup d'oeil à feathers.js
Vous devez vous connecter pour publier un commentaire.
Découvrez express.io
Il a de routage en temps réel les demandes, et un tas d'autres fonctionnalités utiles.
Quant à trouver autour de la réussite de l'
io
objet autour de la. Vous avez quelques options, ce qui peut ou ne peut pas être "mieux" en fonction de qui vous demandez.io
ouapp
mondiale. (certaines personnes freak out sur globals)module.exports
etrequire
l'objet dans l'autre fichier. (peut conduire à la circulaire problèmes de dépendance si ne pas fait correctement)Passage de la
io
objet est probablement le plus propre façon la plus simple, mais vous avez des options.Eh bien, vous n'avez pas vraiment besoin d'exprimer.io pour que. La solution la plus simple serait d'exporter un nouveau module et de passer une référence à douille.io instance.
Donc, dans votre app.js vous avez :
Maintenant besoin d'un nouveau module et la passer à l'socketio de référence. Ajouter cette nouvelle ligne (en app.js) pour ce faire :
Puis créer un nouveau fichier dans votre
path/to/your/socketio/controller
appelé socketio.jsEt enfin dans le socketio.js fichier, exporter votre nouveau module :
Et là vous allez!
socket.io ne marche pas avec les routes, il fonctionne avec des sockets.
Vous ajoutez ce code app.js ou dans un fichier distinct qui vous inclure dans app.js:
Votre mise à jour de l'itinéraire rend seulement un document html avec javascript, contenant:
Donc, une fois que la page est affichée et complet, le client javascript ouvrir un socket vers le serveur et de recevoir des données supplémentaires.
Voir d'autres exemples ici.
Avertissement: le Code écrit à partir de zéro et n'est pas testé.
Le meilleur moyen est d'utiliser la fermeture. Ex:
Et:
J'ai utilisé le middleware routeur de Expressjs (je suis à l'aide de 4.x).
Dans le routage externe fichier j'ai mis le "prochain" objet:
Et dans le fichier principal j'écris la dernière route hop à l'intérieur de l'oi.sur('connexion'):