2015-09-05 3 views
0

J'ai récemment travaillé sur un projet où les utilisateurs créent des messages pour trouver des gens avec lesquels jouer à des jeux vidéo. Jusqu'à présent, j'ai été paresseux et j'ai simplement mis le flux de post à rafraîchir toutes les deux secondes sur un setTimeout, mais il ralentit les interactions avec le serveur après un certain temps, j'ai donc décidé d'apprendre Socket.io pour y remédier.Besoin d'aide pour implémenter Socket.io dans un projet déjà existant

Je ne sais pas comment implémenter Socket.io dans mon projet. J'ai essayé le guide d'installation officiel trouvé here ainsi qu'un guide non officiel trouvé here mais aucun ne semble fonctionner pour moi.

Selon le guide Socket.io officiel, c'est ce que je dois mettre en œuvre pour que cela fonctionne avec mon serveur Express:

var app = require('express')(); 
var server = require('http').createServer(app); 
var io = require('socket.io')(server); 
io.on('connection', function(){ /* … */ }); 
server.listen(3000); 

Et voici ce que mon fichier server.js ressemble actuellement, avec la section entre les barres obliques multiples étant où j'ai essayé de mettre en œuvre le code ci-dessus:

var express = require('express') 
    , passport = require('passport') 
    , util = require('util') 
    , SteamStrategy = require('passport-steam').Strategy 
    , http = require('http') 
    , socketio = require('socket.io'); 
var mongoose = require('mongoose'); 
var config = require('./config'); 


mongoose.connect(config.MONGO_URI); 

mongoose.connection.on('error', function() { 
    console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

passport.use(new SteamStrategy({ 
    returnURL: 'http://localhost:3000/auth/steam/return', 
    realm: 'http://localhost:3000', 
    apiKey: '123123123' 
    }, 
    function(identifier, profile, done) { 
    process.nextTick(function() { 
     profile.identifier = identifier; 
     return done(null, profile); 
    }); 
    } 
)); 

///////////////////HERE//////////////////////// 

var server = require('http').createServer(express); 
var io = require('socket.io')(server); 
io.on('connection', function(){ /* … */ }); 

///////////////////HERE//////////////////////// 

// express config 
app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.static('app')); 
    app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.session({ secret: '*****' })); 
    app.use(passport.initialize()); 
    app.use('/public', express.static(__dirname + '/public')); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.set('socketio', io); 
    app.set('server', server); 
}); 

app.listen(process.env.PORT || 3000, function(){ 
    console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env); 
}); 

require('./routes')(app, passport); 

mon problème est que lorsque je tente de démarrer mon serveur de nœud, il me dit « auditeur doit être un fu nction » de la ligne suivante:

var server = require('http').createServer(express); 

Quand j'ai essayé d'ajouter entre parenthèses après ma condition expresse comme ceci:

var express = require('express')() 

Il me dit que cet objet est pas une fonction, même si c'est la façon dont ils faites-le dans leur exemple officiel.


Comment puis-je implémenter correctement Socket.io dans mon projet? Merci pour toute aide.

+0

Que signifie 'npm ls'? Vous pouvez avoir installé une version très ancienne d'Express (par exemple, 2.x). – mscdex

+0

Pouvez-vous essayer server.listen au lieu de app.listen? – Rodmentou

Répondre

0

Vous devez passer votre express app, pas la valeur de require('express'), qui retourne simplement la fonction qui crée applications Express, à createServer().