我试图从套接字访问会话,但似乎无法建立连接。毫无疑问,授权会失败,我将得到带以下消息的fails回调:
failed connection to socket.io: No session found我将把我的所有代码放在这里,这样就可以更容易地发现我做错了什么。
var express = require('express');
var app = express();
var http = require('http');
var socketio = require('socket.io')
var passportSocketIo = require('passport.socketio');
var port = process.env.PORT || 3000;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var server = http.createServer(app);
var io = socketio.listen(server);
var dbConfig = require('./config/database.js');
mongoose.connect(dbConfig.url);
var sessionStore = new MongoStore({ db: mongoose.connection.db });
require('./config/passport')(passport);
app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'ejs');
app.use(session({
key: 'connect.sid',
secret: 'secret',
store: sessionStore,
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use(express.static(__dirname + '/public'));
require('./app/routes.js')(app, passport);
server.listen(3000, function() {
console.log('App running on port: ' + port);
});
io.use(passportSocketIo.authorize({
passport: passport,
cookieParser: cookieParser,
key: 'connect.sid',
secret: 'secret',
store: sessionStore,
success: onAuthorizeSuccess,
fail: onAuthorizeFail
}));
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
}
function onAuthorizeFail(data, message, error, accept){
if(error)
throw new Error(message);
console.log('failed connection to socket.io:', message);
accept(null, false);
}
io.sockets.on('connection', function(socket) {
var date = new Date();
var time = date.getHours() + ":" + date.getMinutes();
socket.emit('message', {username: 'Server', message: 'welcome to the chat'});
socket.on('send', function(data) {
io.sockets.emit('message', data);
});
});我应该如何与socket.io建立与会话的连接?
此外,我还看到用户数据是通过socket.handshake.user访问的。在这种情况下这是正确的吗?
为了清楚起见,这些版本如下:
express: 4.8.5
passport: 0.2.0
socket.io: 1.0.6
passport.socketio: 3.2.0编辑
问题的一部分似乎是已经存在的localhost与127.0.0.1的错误。然而,现在我没有得到任何握手数据。
发布于 2014-09-25 20:28:25
首先,正如我在问题编辑中所指出的,请确保直接键入IP,而不是使用localhost:127.0.0.1。这是一个已知的错误,当指向localhost时,它将不允许您正确地发送cookie。
针对Github页面 1.x的授权回调,护照-socketioGithub页面最终被更新如下。
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept();
}
function onAuthorizeFail(data, message, error, accept){
console.log('failed connection to socket.io:', data, message);
if(error)
accept(new Error(message));
}此外,握手数据不再存储在相同的位置。将socket.handshake.user替换为socket.request.user。
发布于 2014-09-25 12:51:33
我也有同样的问题。对我来说,解决方案不是在web服务器上,而是由于在浏览器中调用localhost。改变到127.0.0.1或我的文化IP使生活更快乐。
还请参见对:Javascript document.cookie总是空字符串的答复和评论
发布于 2014-09-01 14:37:57
passport.socketio不适用于新版本的socket.io。
您应该能够删除passport.socketio并将当前的io.use替换为下面的一个:
var cookieParser = require('cookie-parser')('secret'); // <- your secret here
io.use(function(socket, next){
cookieParser(socket.handshake, {}, function(err){
if (err) {
console.log("error in parsing cookie");
return next(err);
}
if (!socket.handshake.signedCookies) {
console.log("no secureCookies|signedCookies found");
return next(new Error("no secureCookies found"));
}
sessionStore.get(socket.handshake.signedCookies["connect.sid"], function(err, session){
socket.session = session;
if (!err && !session) err = new Error('session not found');
if (err) {
console.log('failed connection to socket.io:', err);
} else {
console.log('successful connection to socket.io');
}
next(err);
});
});
});https://stackoverflow.com/questions/25456656
复制相似问题