【问题标题】:Need help implementing Socket.io into an already existing project需要帮助将 Socket.io 实施到现有项目中
【发布时间】:2015-09-06 03:49:05
【问题描述】:

我最近一直在做一个项目,用户发布帖子来寻找可以一起玩视频游戏的人。到目前为止,我一直很懒惰,只是在 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?感谢您的所有帮助。

【问题讨论】:

  • npm ls 显示什么?您可能安装了非常旧的 Express 版本(例如 2.x)。
  • 你可以试试 server.listen 代替 app.listen 吗?

标签: node.js sockets express socket.io


【解决方案1】:

您需要将您的 Express app 传递给 createServer(),而不是 require('express') 的值,它只是将 创建 Express 应用程序的函数返回给 createServer()

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多