我收到错误" TypeError:无法读取属性'握手'未定义"当我使用我的应用程序,因为我已经安装了socket.io
似乎helpers/utils.js
文件中的 checkUserHaveConnect 方法导致错误,因为我的console.log(" io 2",io")是在错误之前调用(这可以在下面的截图中看到)
奇怪的是,我的开发环境(笔记本电脑)上没有出现此错误,但只有在生产中部署时才会出现此错误(nodejitsu)。
首先,这是我的索引文件,其中启动了socket.io连接。
index.js
var server = http.createServer(app);
var io = require('socket.io').listen(server);
GLOBAL.io = io;
// launch
server.listen(port);
//With Socket.io >= 1.0
io.use(passportSocketIo.authorize({
cookieParser: express.cookieParser,
key: EXPRESS_SID_KEY, // the name of the cookie where express/connect stores its session_id
secret: SESSION_SECRET, // the session_secret to parse the cookie
store: sessionStore, // we NEED to use a sessionstore. no memorystore please
success: onAuthorizeSuccess, // *optional* callback on success - read more below
fail: onAuthorizeFail, // *optional* callback on fail/error - read more below
}));
io.on('connection', function (socket) {
console.log("connection come");
socket.on('disconnect', function (socket) {
console.log("disconnect come");
});
});
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
}
function onAuthorizeFail(data, message, error, accept){
console.log('failed connection to socket.io:', message);
if(error){
throw new Error(message);
}
// We use this callback to log all of our failed connections.
accept(null, false);
}
console.log('The magic happens on port' + port);
以下是可能导致问题的方法。
助手/ utils.js
var passportSocketIo = require("passport.socketio");
exports.emitData = function(userId, eventName,data){
console.log("io 1", io);
var sockets = passportSocketIo.filterSocketsByUser(io, function(user){
if(user._id){
return user._id.toHexString() === userId.toHexString();
}
return false;
});
sockets.forEach(function(socket){
socket.emit(eventName,data);
});
return sockets.length;
}
exports.checkUserHaveConnect = function(userId){
console.log("io 2", io);
return passportSocketIo.filterSocketsByUser(io, function(user){
if(user._id){
return user._id.toHexString() === userId.toHexString();
}
return false;
}).length;
}
答案 0 :(得分:1)
该功能已损坏,因为socket.io> 1.0没有握手数据(替换为" request"),这在passport.socketio filterSocketsByUser方法中使用。
在修改npm的路上有一个修复,同时你可以在包中替换:
function filterSocketsByUser(socketIo, filter){
var handshaken = socketIo.sockets.manager.handshaken;
return Object.keys(handshaken || {})
.filter(function(skey){
return filter(handshaken[skey].user);
})
.map(function(skey){
return socketIo.sockets.manager.sockets.sockets[skey];
});
}
以下(由Gausie提供):
function filterSocketsByUser(socketIo, filter){
var handshaken = [];
for ( var i in socketIo.sockets.connected )
if ( socketIo.sockets.connected[i].handshake )
handshaken.push( socketIo.sockets.connected[i] )
return Object.keys(handshaken || {})
.filter(function(skey){
return filter(handshaken[skey].conn.request.user);
})
.map(function(skey){
return handshaken[skey];
});
}
来源:Github
答案 1 :(得分:0)
要解决此问题,我必须使用最新版本的passport.socketio,因为NPM上的版本已过期。
当我使用nodejitsu时,我不得不在package.json文件中添加一个“bundleDependencies”部分,如下所示:
"bundleDependencies": [
"passport.socketio"
],
这确保使用本地版本的passport.socketio而不是NPM版本。