我想在用户进入应用程序时创建用户sessison.并在需要时阅读会话.这是我的尝试
var io = require('socket.io'),
express = require('express');
querystring = require('querystring');
var app = express.createServer();
app.get('/', function(req, res){
var sessionVal = querystring.parse(req.url.substr(2));// sessionVal is an email for example: me@gmail.com
app.use(express.cookieParser());
app.use(express.session({ secret: sessionVal }));
});
var socket = io.listen(app);
socket.on('connection', function(client) {
client.on('message', function(message) {
// message will be an object {text:'user text chat blah blah', email:'me@gmail.com'}
// if the seesion stored, has the same value with message.email
// then the message will be broadcasted
socket.broadcast(message.text);
// else will not broadcast
});
});
app.listen(4000);
Run Code Online (Sandbox Code Playgroud)
Sté*_*hen 73
我需要在此指出,您错误地将中间件添加到应用程序中.该app.use电话不应该内完成app.get的请求处理程序,但它的外面.只需在之后直接调用它们createServer,或者查看文档中的其他示例.
传递给的秘密express.session应该是字符串常量,或者可能是从配置文件中获取的东西.不要喂它客户可能知道的东西,这实际上是危险的.这只是服务器应该知道的秘密.
如果您想在会话中存储电子邮件地址,只需执行以下操作:
req.session.email = req.param('email');
Run Code Online (Sandbox Code Playgroud)
随着那个...
如果我理解正确,你要做的是处理一个或多个HTTP请求并跟踪会话,然后打开一个Socket.IO连接,你也需要会话数据.
这个问题的棘手之处在于Socket.IO http.Server通过劫持request事件来制作神奇的工具.因此,在Socket.IO连接上永远不会调用Express'(或者更确切地说是Connect)会话中间件.
我相信你可以通过一些技巧来完成这项工作.
您可以访问Connect的会话数据; 您只需要获得对会话存储的引用.最简单的方法是在调用之前自己创建商店express.session:
// A MemoryStore is the default, but you probably want something
// more robust for production use.
var store = new express.session.MemoryStore;
app.use(express.session({ secret: 'whatever', store: store }));
Run Code Online (Sandbox Code Playgroud)
每个会话存储都有一个get(sid, callback)方法.的sid参数,或会话ID,被存储在客户端上的cookie.该cookie的默认名称是connect.sid.(但您可以通过key在express.session通话中指定选项来为其指定任何名称.)
然后,您需要在Socket.IO连接上访问该cookie.不幸的是,Socket.IO似乎没有让你访问http.ServerRequest.一个简单的解决方法是在浏览器中获取cookie,并通过Socket.IO连接发送它.
然后,服务器上的代码将如下所示:
var io = require('socket.io'),
express = require('express');
var app = express.createServer(),
socket = io.listen(app),
store = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({ secret: 'something', store: store }));
app.get('/', function(req, res) {
var old = req.session.email;
req.session.email = req.param('email');
res.header('Content-Type', 'text/plain');
res.send("Email was '" + old + "', now is '" + req.session.email + "'.");
});
socket.on('connection', function(client) {
// We declare that the first message contains the SID.
// This is where we handle the first message.
client.once('message', function(sid) {
store.get(sid, function(err, session) {
if (err || !session) {
// Do some error handling, bail.
return;
}
// Any messages following are your chat messages.
client.on('message', function(message) {
if (message.email === session.email) {
socket.broadcast(message.text);
}
});
});
});
});
app.listen(4000);
Run Code Online (Sandbox Code Playgroud)
这假设您只想读取现有会话.您实际上无法创建或删除会话,因为Socket.IO连接可能没有HTTP响应来发送Set-Cookie标头(想想WebSockets).
如果要编辑会话,则可以使用某些会话存储.例如,CookieStore不起作用,因为它还需要发送Set-Cookie标题,但它不能.但对于其他商店,您可以尝试调用该set(sid, data, callback)方法,看看会发生什么.
互操作socket.io和连接会话支持很麻烦.问题不是因为socket.io以某种方式"劫持"请求,而是因为某些socket.io传输(我认为flashsockets)不支持cookie.我可能错了cookie,但我的方法如下:
小智 5
当我使用req.session.email = req.param('email')时,我忘了告诉一个错误,服务器错误说无法解决未定义的属性电子邮件.
这个错误的原因是app.use的顺序错误.您必须按此顺序配置express:
app.use(express.cookieParser());
app.use(express.session({ secret: sessionVal }));
app.use(app.route);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101019 次 |
| 最近记录: |