node.js / socket.io,cookies 只在本地工作
Posted
技术标签:
【中文标题】node.js / socket.io,cookies 只在本地工作【英文标题】:node.js / socket.io, cookies only working locally 【发布时间】:2012-04-26 18:08:30 【问题描述】:我正在尝试使用基于 cookie 的会话,但是它只能在本地机器上工作,而不是通过网络工作。如果我删除与会话相关的内容,它会在网络上正常工作...
您必须原谅这里缺乏高质量的代码,我刚开始使用节点/套接字等,找到任何明确的指南都很难,所以我现在处于 n00b 领域。基本上,到目前为止,这是从各种 sn-ps 一起破解的,大约 10% 了解我实际上在做什么......
我在 Chrome 中看到的错误是:
socket.io.js:1632GET http://192.168.0.6:8080/socket.io/1/?t=1334431940273500(内部服务器错误)
Socket.handshake ------- socket.io.js:1632
Socket.connect ------- socket.io.js:1671
Socket ------- socket.io.js:1530
io.connect ------- socket.io.js:91
(匿名函数)------- /socket-test/:9
jQuery.extend.ready ------- jquery.js:438
在我看到的服务器控制台中:
调试 - 提供静态内容 /socket.io.js
调试 - 授权
警告 - 握手错误没有 cookie
我的服务器是:
var express = require('express')
, app = express.createServer()
, io = require('socket.io').listen(app)
, connect = require('express/node_modules/connect')
, parseCookie = connect.utils.parseCookie
, RedisStore = require('connect-redis')(express)
, sessionStore = new RedisStore();
app.listen(8080, '192.168.0.6');
app.configure(function()
app.use(express.cookieParser());
app.use(express.session(
secret: 'YOURSOOPERSEKRITKEY',
store: sessionStore
));
);
io.configure(function()
io.set('authorization', function(data, callback)
if(data.headers.cookie)
var cookie = parseCookie(data.headers.cookie);
sessionStore.get(cookie['connect.sid'], function(err, session)
if(err || !session)
callback('Error', false);
else
data.session = session;
callback(null, true);
);
else
callback('No cookie', false);
);
);
var users_count = 0;
io.sockets.on('connection', function (socket)
console.log('New Connection');
var session = socket.handshake.session;
++users_count;
io.sockets.emit('users_count', users_count);
socket.on('something', function(data)
io.sockets.emit('doing_something', data['data']);
);
socket.on('disconnect', function()
--users_count;
io.sockets.emit('users_count', users_count);
);
);
我的页面JS是:
jQuery(function($)
var socket = io.connect('http://192.168.0.6', port: 8080 );
socket.on('users_count', function(data)
$('#client_count').text(data);
);
socket.on('doing_something', function(data)
if(data == '')
window.setTimeout(function()
$('#target').text(data);
, 3000);
else
$('#target').text(data);
);
$('#textbox').keydown(function()
socket.emit('something', data: 'typing' );
);
$('#textbox').keyup(function()
socket.emit('something', data: '' );
);
);
【问题讨论】:
我遇到了同样的问题,但是,只有在使用 Chrome 时。我的应用程序在 Safari 中运行良好。你有同样的情况吗?我不确定解决方案是什么。 【参考方案1】:检查您的系统时钟,如果服务器和客户端的时钟不同,cookie 可能会在您设置后立即过期。
【讨论】:
检查了时钟,它们看起来不错 - 饼干通常也可以与其他东西一起使用 好吧,似乎 data.headers.cookie 不存在。您可以转储请求标头以查看发生了什么吗?以上是关于node.js / socket.io,cookies 只在本地工作的主要内容,如果未能解决你的问题,请参考以下文章
未找到 Socket.io.js(node.js + express + socket.io)
Node.js - Socket.io:socket.request 未定义
HTTP 状态代码 200 但页面未加载 Node.js Socket.io -- 使用 Socket.io 的 Node.js 教程,Daniel Nill,fs.readFile(),socket