Voici donc le problème: j'essaye d'utiliser socket.io dans un projet express. Après le lancement d'Express Js 4, j'ai mis à jour mon générateur express et maintenant les fonctions initiales de l'application vont dans le ./bin/www
fichier, y compris ces vars (contenu du fichier www: http://jsfiddle.net/avMa5/ )
var server = app.listen(app.get('port'), function() {..}
(vérifiez-le d'ici npm install -g express-generator
et ensuiteexpress myApp
Cela étant dit, rappelons-nous comment la documentation socket.io nous demande de le déclencher:
var app = require('express').createServer();
var io = require('socket.io')(app);
Ok mais je ne peux pas le faire dans app.js, comme recommandé. Cela devrait être fait dans ./bin/www pour fonctionner. dans ./bin/www voici ce que je peux faire pour le faire fonctionner:
var io = require('socket.io')(server)
Ok cela fonctionne, mais je ne peux pas utiliser le var io ailleurs, et je ne veux vraiment pas mettre mes fonctions socket.io dans un www
fichier.
Je suppose que ce n'est qu'une syntaxe de base, mais je ne peux pas faire fonctionner cela, même pas en utilisant module.exports = server
ou server.exports = server
ni module.exports.io = app(io)
sur le fichier www
La question est donc: comment puis-je utiliser socket.io en ayant ce fichier / bin / www comme point de départ de mon application?
la source
./bin/www.
. Mettez-le simplement au même endroit, là où vousvar app
êtes.Réponses:
J'ai une solution pour rendre socket.io disponible dans app.js.
app.js:
bin / www:
De cette façon, vous pouvez accéder à la variable io dans votre app.js, et même la rendre disponible pour vos routes en définissant module.exports comme une fonction qui accepte io comme paramètre.
index.js
Ensuite, passez io dans le module après sa configuration:
app.js
la source
app.io = io;
dans leapp.js
fichierapp
objet? Mieux vaut utiliser des symboles ouapp.set()
.app.io = io
quand vous pourriez utiliser à lamodule.exports = { app, io }
placeUne approche un peu différente pour initier
socket.io
, elle regroupe tout le code associé en un seul endroit:bin / www
socketApi.js
app.js
De cette façon, tout le
socket.io
code associé dans un module et en fonction, je peux l'invoquer de n'importe où dans l'application.la source
io.attach is not a function
Il s'avère que c'était vraiment un problème de base sintax .... J'ai obtenu ces lignes de ce tutoriel de chat socket.io ...
sur ./bin/www, juste après
var server = app.listen(.....)
alors maintenant je crée le fichier ../sockets/base.js et je mets ce petit bonhomme dedans:
Ouais! Maintenant ça marche ... Donc je suppose que je n'avais vraiment pas d'autre choix que de démarrer socket.io dans / bin / www, car c'est là que mon serveur http a été démarré. Le but est que maintenant je puisse créer des fonctionnalités de socket dans d'autres fichiers, en gardant la chose modulaire, en
require('fileHere')(io);
<3
la source
io.on('connection', function(socket) { res.render('connection.jade') });
Les anciens "expressjs", tout se passe dans le fichier "app.js". Ainsi, la liaison socket.io au serveur se produit également dans ce fichier. (BTW, on peut toujours le faire à l'ancienne, et supprimer bin / www)
Maintenant, avec les nouveaux expressjs, cela doit se produire dans le fichier "bin / www".
Heureusement, javascript / requirejs a facilité le passage d'objets. Comme l'a souligné Gabriel Hautclocq, socket.io est toujours "importé" dans "app.js" et il est attaché à l'objet "app" via une propriété
Le socket.io est rendu vivant en y attachant le serveur dans "bin / www"
car l'objet "app" est passé dans "bin / www" plus tôt
C'est vraiment aussi simple que
Mais le faire de la manière «difficile» garantit que
app.io
contient maintenant l'objet socke.io.Maintenant, si vous avez besoin de cet objet socket.io également dans "routes / index.js" par exemple, utilisez simplement le même principe pour faire passer cet objet.
D'abord dans "app.js", faites
Puis dans "routes / index.js"
Donc "io" est injecté dans "index.js".
la source
Mise à jour de la réponse de Gabriel Hautclocq :
Dans le fichier www, le code doit apparaître comme suit en raison des mises à jour avec Socket.io. Attach est maintenant Listen.
De plus, pour que cette connexion fonctionne, il faut également implémenter l'API côté client. Ce n'est pas spécifique à Express, mais sans cela, l'appel de connexion ne fonctionnera pas. L'API est incluse dans
Incluez ce fichier sur le front-end et testez les éléments suivants:
la source
Après avoir lu tous les commentaires, j'ai trouvé ce qui suit en utilisant Socket.io Server Version: 1.5.0
Problèmes que j'ai rencontrés:
var sockIO = require ('socket.io') doit être var sockIO = require ('socket.io') () . (Crédit à: Zhe Hu )
sockIO.attach doit être sockIO. écouter (Crédit à: rickrizzo )
Pas
Installez Socket.io avec la commande suivante:
Ajoutez ce qui suit à app.js :
Dans bin / www , après var server = http.createServer (app) , ajoutez ce qui suit:
Pour tester la fonctionnalité, dans app.js , vous pouvez ajouter la ligne:
la source
Un tutoriel pour les débutants de Cedric Pabst
voici les brèves bases du lien pour un chat d'application:
en utilisant express-generate et le moteur ejs utilisable dans tous les fichiers .ejs routage standard dans express-generate
éditez le fichier bin \ www et ajoutez ce app.io.attach (serveur); comme ça
modifier dans app.js
modifier dans index.ejs
Amusez-vous :) et merci beaucoup à Cedric Pabst
la source
Certaines réponses précédentes ne fonctionnent pas et d'autres sont trop compliquées. Essayez plutôt la solution suivante ...
Installez les modules de nœud socket.io côté serveur et côté client:
Du côté serveur
Ajoutez le code suivant à bin / www après la définition du serveur,
var server = http.createServer(app);
:Côté client
Si vous utilisez webpack, ajoutez le code suivant à votre fichier webpack entry.js :
Terminé. Visitez votre site et consultez la console développeur js du navigateur.
la source