当 socket.io 查找会话时,我收到握手错误,因为 cookie 的 id 与数据库中的不匹配。我正在使用 Express3、mongodb、connect-mongodb 和 socket.io v0.9.10
例如,来自 socket.io 代码的 console.log(data.sessionID) 的结果将打印出:
s:eFFkUnQXWdTO7GBRDc11No/a.U6voj5QnxKs1skq766nO7/qJvPEJA73KaQM67qNEs/k
但是当我查看数据库上的会话集合时,我得到以下_id:
"_id" : "eFFkUnQXWdTO7GBRDc11No/a",
如您所见,这对应于 s: 之后和句点之前的 data.sessionID。我尝试使用两种不同的 cookie 解析器。下面解析器的代码来自 express 3 中包含的 cookie 模块。我不确定每个 cookie ID 是否都遵循这种模式,所以我不知道我是否应该自己再次解析结果,或者我是否有什么东西做错了。
exports.parseCookie = function(str) {
var obj = {}
var pairs = str.split(/[;,] */);
var encode = encodeURIComponent;
var decode = decodeURIComponent;
pairs.forEach(function(pair) {
var eq_idx = pair.indexOf('=')
var key = pair.substr(0, eq_idx).trim()
var val = pair.substr(++eq_idx, pair.length).trim();
// quoted values
if ('"' == val[0]) {
val = val.slice(1, -1);
}
// only assign once
if (undefined == obj[key]) {
obj[key] = decode(val);
}
});
return obj;
};
下面的代码给了我一个握手错误,因为“connect.sid”属性与数据库中的 id 属性不匹配。
io.set('authorization', function (data, accept) {
if (data.headers.cookie) {
data.cookie = utils.parseCookie(data.headers.cookie);
data.sessionID = data.cookie['connect.sid'];
// **************** //
console.log(data.sessionID);
// **************** //
sessionStore.get(data.sessionID, function (err, session) {
if (err || ! session) {
accept('Error', false);
} else {
data.session = session;
data.session.url = data.headers.referer;
accept(null, true);
}
});
} else {
return accept('No cookie transmitted.', false);
}
});