我已经通过https使用express 3.1.4设置了node.js服务器。我正试图用socket.io直接更新和查找我的会话对象(使用sessionStore)。我使用了握手授权过程的扩展示例和解释。但在设置了授权流程后,socket.io会突然停止以启动连接。
我做了研究并尝试了许多解决方案,包括redis、mongoStore和session.socket.io,但我似乎总是以套接字不连接告终,我很确定这与在https中搜索有关。
有人知道为什么这个设置不起作用吗?如果我们去掉io.set,套接字会突然重新启动连接。。
提前谢谢!
var io = require('socket.io'),
https = require('https'),
express = require('express');
var path = require('path');
var express = require('express');
var http = require('http');
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var fs = require('fs');
var passphrase = "";
var options = {
key: fs.readFileSync('var/keys/server.key'),
cert: fs.readFileSync('var/keys/server.crt')
};
if(passphrase) {
options.passphrase = passphrase;
}
// We define the key of the cookie containing the Express SID
var EXPRESS_SID_KEY = 'express.sid';
// We define a secret string used to crypt the cookies sent by Express
var COOKIE_SECRET = 'some secret';
var cookieParser = express.cookieParser(COOKIE_SECRET);
// Create a new store in memory for the Express sessions
var sessionStore = new express.session.MemoryStore();
var app = express();
// Configure Express app with :
// * Cookie Parser created above
// * Configure Session Store
app.configure(function () {
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('view options', { layout: false });
app.use(express.logger());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(cookieParser);
app.use(express.session({
store: sessionStore,
cookie: {
httpOnly: true
},
key: EXPRESS_SID_KEY
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use("/app", express.static(__dirname + "/app"));
});
//passport config
var Account = require('./models/account');
passport.use(new LocalStrategy(Account.authenticate()));
passport.serializeUser(Account.serializeUser());
passport.deserializeUser(Account.deserializeUser());
//mongoose
mongoose.connect('mongodb://localhost/passport_local_mongoose');
// Configture routes
require('./routes')(app);
// Create https server, register socket.io as listener
server = https.createServer(options, app);
app.set('port', process.env.PORT || 3000);
console.log(("Express server listening on port " + app.get('port')));
io = io.listen(server);
// We configure the socket.io authorization handler (handshake)
io.set('authorization', function (data, callback) {
if(!data.headers.cookie) {
return callback('No cookie transmitted.', false);
}
cookieParser(data, {}, function(parseErr) {
if(parseErr) { return callback('Error parsing cookies.', false); }
// Get the SID cookie
var sidCookie = (data.secureCookies && data.secureCookies[EXPRESS_SID_KEY]) ||
(data.signedCookies && data.signedCookies[EXPRESS_SID_KEY]) ||
(data.cookies && data.cookies[EXPRESS_SID_KEY]);
// Then we just need to load the session from the Express Session Store
sessionStore.load(sidCookie, function(err, session) {
// And last, we check if the used has a valid session and if he is logged in
if (err || !session || session.isLogged !== true) {
callback('Not logged in.', false);
} else {
// You can access it later with "socket.handshake.session"
data.session = session;
callback(null, true);
}
});
});
});
io.on('connection', function (socket) {
console.log("socket.io started on port"+ app.get('port'));
socket.on("request",function(data){
console.log("socket answer = "+ data);
socket.emit("response", [ "docA" ,"docB"]);
});
socket.on("save",function(data){
console.log("socket save = "+ data);
memory += data + " ";
console.log("memory = "+ memory);
});
});
server.listen(3000);
好吧,我找到了问题的解决方案。我仍然不知道为什么套接字握手在https中不能正常工作。我决定把猫鼬和MongoDb连接起来。它在https中运行良好,并且可以根据需要在req-res函数调用之外使用。
我也可以把它和我的插座一起使用。on,所以它排除了我的问题。