【发布时间】: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