gpt4 book ai didi

node.js - nodeJS - 如何使用 express 创建和读取 session

转载 作者:IT老高 更新时间:2023-10-28 21:52:34 31 4
gpt4 key购买 nike

我想在用户进入应用程序时创建一个用户 session 。并在需要时阅读 session 。这是我的尝试

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);

最佳答案

我需要在此指出您错误地将中间件添加到应用程序中。 app.use 调用不应在 app.get 请求处理程序内完成,而应在其外部完成。只需在 createServer 之后直接调用它们,或查看 the other examples in the docs .

您传递给 express.session 的 secret 应该是字符串常量,或者可能是从配置文件中获取的内容。不要喂它客户可能知道的东西,这实际上很危险。这是只有服务器应该知道的 secret 。

如果您想在 session 中存储电子邮件地址,只需执行以下操作:

req.session.email = req.param('email');

不碍事...


如果我理解正确,您尝试做的是处理一个或多个 HTTP 请求并跟踪 session ,然后打开一个 Socket.IO 连接,您也需要从中获取 session 数据。

这个问题的棘手之处在于 Socket.IO 在任何 http.Server 上的魔法工作是通过劫持 request 事件。因此,Express'(或者更确切地说是 Connect 的) session 中间件永远不会在 Socket.IO 连接上调用。

我相信你可以通过一些技巧来完成这项工作。

您可以获取 Connect 的 session 数据;您只需要获取对 session 存储的引用。最简单的方法是在调用 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 }));

每个 session 存储都有一个 get(sid, callback) 方法。 sid 参数或 session ID 存储在客户端的 cookie 中。该 cookie 的默认名称是 connect.sid。 (但您可以通过在 express.session 调用中指定 key 选项来为其命名。)

然后,您需要在 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);

这假设您只想阅读现有 session 。您实际上无法创建或删除 session ,因为 Socket.IO 连接可能没有 HTTP 响应来发送 Set-Cookie header (想想 WebSockets)。

如果您想编辑 session ,这可能适用于某些 session 存储。例如,CookieStore 不起作用,因为它还需要发送一个 Set-Cookie header ,而它不能。但是对于其他商店,您可以尝试调用 set(sid, data, callback) 方法,看看会发生什么。

关于node.js - nodeJS - 如何使用 express 创建和读取 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765777/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com