我正在尝试将Express(3.x)与NowJS(主要是Socket.io的包装器)结合起来创建一个首先要求您登录的实时应用程序。我无疑是Node的新手,但我对每个包的工作原理有很好的处理。但是,从NowJS访问Express Session信息让我感到满意。
问题似乎是因为我被迫使用XHR-Polling(使用Heroku作为托管平台),我无法在Socket.io身份验证方法中轻松访问cookie信息。在authFunction的下面的代码中,“data.headers.cookie”未定义。以迂回的方式(在Now.js代码中),这会在nowjs.on(“connect”,...)回调中留下“this.user.cookie”为空(但不是未定义)。这反过来使我无法获取会话信息。
从阅读开始,似乎只有在使用websockets时才可以使用cookie。没有cookie,我不知道哪个用户正在调用服务器,而不是为他们生成的随机标识符。
有人可以建议如何处理这个问题吗?在建立与Now.js服务器的连接时,是否需要从客户端手动发送cookie?
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.engine('html', consolidate.swig);
app.set('view engine', 'html');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ secret: "secrethere" , store: sessionStore}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
});
app.configure('development', function(){
app.use(express.errorHandler({dumpExceptions: true, showStack: true}));
});
//Map the routes
var routes = require('./routes/routes')(db);
app.get[...] //routes defined here
var server = http.createServer(app, {cookieKey: 'connect.sid'});
server.listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
var parseCookie = require('express/node_modules/connect').utils.parseCookie;
var authFunction = function (data, accept) {
// check if there's a cookie header
if (data.headers.cookie) {
// if there is, parse the cookie
data.cookie = parseCookie(data.headers.cookie);
// note that you will need to use the same key to grad the
// session id, as you specified in the Express setup.
data.sessionID = data.cookie['connect.sid'];
} else {
// if there isn't, turn down the connection with a message
// and leave the function.
return accept('No cookie transmitted.', false);
}
// accept the incoming connection
accept(null, true);
};
var everyone = nowjs.initialize(server, {socketio: {transports: ['xhr-polling', 'jsonp-polling'], authorization: authFunction}});
nowjs.on('connect', function (socket) {
//TODO - This will need to be based on the URL that is being visited, or
//similar to establish that users are viewing the same thing
var sid = unescape(this.user.cookie["connect.sid"]); //# you DO have to unescape the session id!
sessionStore.get(sid, function(err, sess){
console.log("That group who joined? his userId is " + sess.userId)
});
var newRoom = "group";//this.user.session;//.groupName;
var newGroup = nowjs.getGroup(newRoom);
this.now.serverRoom = newRoom;
newGroup.addUser(this.user.clientId);
});
编辑:我当然更喜欢简单的解决方案,例如最常见的答案:Session support in Now.js,但这对我来说不起作用(可能)同样的原因 - 我的“cookie”是空的并且不包含“connect.sid”键。
答案 0 :(得分:0)
经过大量尝试不同的事情,我意识到这实际上与我使用的环境(Cloud9 IDE)有关。
使用Cloud9进行调试时,它们为您提供了一个很好的网址,可以在“http:// [projectname]。[username] .c9.io”中浏览您的网站。但是,NowJS将其请求发送到“http:// project- [unique ID] .rhcloud.com / socket.io / 1 / xhr-polling / ...”。这是不提示cookie与请求一起发送,因为它与cookie关联的主机不同(好吧,术语可能稍微偏离这里)。
要解决此问题,我使用“http:// project- [unique ID] .rhcloud.com / ...”作为我的调试基础,它似乎100%正常工作。 Heroku似乎没有这个问题,因为所有请求(常规页面请求和 socketio)都通过同一主机。