需要帮助将Socket.io实现到现有项目中

时间:2015-09-05 18:35:58

标签: node.js sockets express socket.io

我最近一直致力于一个项目,在这个项目中,用户会发帖子找人玩视频游戏。到目前为止,我一直很懒,只是设置post feed在setTimeout上每两秒刷新一次,但是一段时间后它会减慢与服务器的交互,所以我决定学习Socket.io来解决这个问题。

我不知道如何将Socket.io实现到我的项目中。我已经尝试了here找到的官方设置指南以及here找到的非官方指南,但似乎对我都不起作用。

根据官方Socket.io指南,这是我需要实现它才能与我的Express服务器一起使用:

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

这就是我的server.js文件当前的样子,多个斜杠之间的部分是我尝试实现上述代码的地方:

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);

我的问题是,当我尝试启动我的节点服务器时,它告诉我'监听器必须是关于以下行的函数':

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

当我尝试在我的明确要求之后添加括号时:

var express = require('express')()

它告诉我那个对象不是一个函数,即使这是他们在官方例子中的表现。

如何正确地将Socket.io实现到我的项目中?感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要将app,而不是require('express')的值传递给createServer(),而{{1}}只返回创建 Express应用的功能。< / p>