栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

nodeJS-如何使用Express创建和读取会话

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

nodeJS-如何使用Express创建和读取会话

我需要在这里指出您错误地将中间件添加到应用程序中。该

app.use
电话不应该内完成
app.get
的请求处理程序,但它的外面。只需在之后直接调用它们
createServer
,或查看文档中的其他示例。

您传递给的机密

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

如果要在会话中存储电子邮件地址,只需执行以下操作:

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

有了这个…


如果我理解正确,那么您想要做的就是处理一个或多个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 }));

每个会话存储区都有一个

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

假设您只想读取现有会话。您实际上无法创建或删除会话,因为Socket.IO连接可能没有HTTP响应来发送

Set-cookie
标头(请考虑使用WebSockets)。

如果要编辑会话,则可以在某些会话存储中使用。例如,cookieStore无效,因为它还需要发送一个

Set-cookie
标头,但它不能。但是对于其他商店,您可以尝试调用该
set(sid, data, callback)
方法,看看会发生什么。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号