- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
设置 session 并在 PHP 中使用它们真的很容易。但是我的网站需要处理 WebSockets。我在 node.js 中设置 session 时遇到问题。我可以在不使用 session 的情况下轻松推送数据,它可以正常工作,但是当打开多个选项卡时,会创建新的 socket.id 并且之前打开的选项卡将无法正常运行。所以我一直在处理 session 并且在访问 session 存储时遇到了问题,它的日志 session 没有被抓取。我也尝试过 session.load 但没有运气
如何获取 session 对象并以打开其他选项卡不会影响功能并在所有选项卡上将数据从服务器推送到客户端的方式使用它?
var express=require('express');
var http = require('http');
var io = require('socket.io');
var cookie = require("cookie");
var connect = require("connect"),
MemoryStore = express.session.MemoryStore,
sessionStore = new MemoryStore();
var app = express();
app.configure(function () {
app.use(express.cookieParser());
app.use(express.session({store: sessionStore
, secret: 'secret'
, key: 'express.sid'}));
app.use(function (req, res) {
res.end('<h2>Hello, your session id is ' + req.sessionID + '</h2>');
});
});
server = http.createServer(app);
server.listen(3000);
sio = io.listen(server);
var Session = require('connect').middleware.session.Session;
sio.set('authorization', function (data, accept) {
// check if there's a cookie header
if (data.headers.cookie) {
// if there is, parse the cookie
data.cookie = connect.utils.parseSignedCookies(cookie.parse(data.headers.cookie),'secret');
// 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['express.sid'];
sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) {
// if we cannot grab a session, turn down the connection
console.log("session not grabbed");
accept('Error', false);
} else {
// save the session data and accept the connection
console.log("session grabbed");
data.session = session;
accept(null, true);
}
});
} 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);
});
sio.sockets.on('connection', function (socket) {
console.log('A socket with sessionID ' + socket.handshake.sessionID
+ ' connected!');
});
最佳答案
看看这篇文章:Session-based Authorization with Socket.IO
您的代码运行良好,但需要进行 2 处改进才能完成您想要的工作(从服务器向客户端发送 session 数据):
sessionID
sessionID
从存储中提取 session 数据,您可以在此间隔内将数据从服务器发送到客户端。这是改进后的代码:
var express = require('express');
var connect = require('connect');
var cookie = require('cookie');
var sessionStore = new express.session.MemoryStore();
var app = express();
app.use(express.logger('dev'));
app.use(express.cookieParser());
app.use(express.session({store: sessionStore, secret: "secret", key: 'express.sid'}));
// web page
app.use(express.static('public'));
app.get('/', function(req, res) {
var body = '';
if (req.session.views) {
++req.session.views;
} else {
req.session.views = 1;
body += '<p>First time visiting? view this page in several browsers :)</p>';
}
res.send(body + '<p>viewed <strong>' + req.session.views + '</strong> times.</p>');
});
var sio = require('socket.io').listen(app.listen(3000));
sio.set('authorization', function (data, accept) {
// check if there's a cookie header
if (data.headers.cookie) {
// if there is, parse the cookie
var rawCookies = cookie.parse(data.headers.cookie);
data.sessionID = connect.utils.parseSignedCookie(rawCookies['express.sid'],'secret');
// it checks if the session id is unsigned successfully
if (data.sessionID == rawCookies['express.sid']) {
accept('cookie is invalid', false);
}
} 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);
});
sio.sockets.on('connection', function (socket) {
//console.log(socket);
console.log('A socket with sessionID ' + socket.handshake.sessionID + ' connected!');
// it sets data every 5 seconds
var handle = setInterval(function() {
sessionStore.get(socket.handshake.sessionID, function (err, data) {
if (err || !data) {
console.log('no session data yet');
} else {
socket.emit('views', data);
}
});
}, 5000);
socket.on('disconnect', function() {
clearInterval(handle);
});
});
然后您可以在 http://localhost:3000/client.html
的 public/client.html
下有一个客户端页面,以查看从 http://localhost:3000
:
<html>
<head>
<script src="/socket.io/socket.io.js" type="text/javascript"></script>
<script type="text/javascript">
tick = io.connect('http://localhost:3000/');
tick.on('data', function (data) {
console.log(data);
});
tick.on('views', function (data) {
document.getElementById('views').innerText = data.views;
});
tick.on('error', function (reason){
console.error('Unable to connect Socket.IO', reason);
});
tick.on('connect', function (){
console.info('successfully established a working and authorized connection');
});
</script>
</head>
<body>
Open the browser console to see tick-tocks!
<p>This session is viewed <b><span id="views"></span></b> times.</p>
</body>
关于javascript - express.session.MemoryStore 不返回 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302242/
我正在开展一个项目,该项目目前将 Redis 数据存储在名为 RedisLabs 的托管服务中。我阅读了 GCP MemoryStore,发现它适合我的项目。所以我正在尝试从 RedisLabs 迁移
今天我第一次在“生产”模式下运行我的 Node.js 应用程序并收到以下警告: Warning: connection.session() MemoryStore is not designed fo
在开发过程中从本地计算机访问Memorystore的最佳方法是什么?是否可以使用Cloud SQL Proxy之类的东西来建立隧道? 最佳答案 您可以启动Compute Engine实例,并使用端口转
我找不到任何明确说明 GCP 的 Memorystore 产品 (redis) 静态加密的内容。 本文档指出“所有 Google Cloud Platform 产品中的静态数据均默认加密。了解按产品的
我找不到任何明确说明 GCP 的 Memorystore 产品 (redis) 静态加密的内容。 本文档指出“所有 Google Cloud Platform 产品中的静态数据均默认加密。了解按产品的
Dojo 是否有任何实用程序用于将数据存储在 MemoryStore 中,或者可选地存储在任何数据集合中? 我需要来自MemoryStore的所有数据,但按单个事件排序。更多专栏。类似于 Java 中
我已经创建了一个 IP 10.190.50.3 的 Memorystore 实例(这是在 us-east1 中)。我有一个名为 my-gcp 的共享 VPC 设置,我在创建 Memorystore 实
我有 Memorystore 实例: gcloud redis instances list --region europe-west1 INSTANCE_NAME VERSION R
设置 session 并在 PHP 中使用它们真的很容易。但是我的网站需要处理 WebSockets。我在 node.js 中设置 session 时遇到问题。我可以在不使用 session 的情况下
我将 Google Memorystore for Redis 用于我们的内存数据存储,我正在处理数据流管道以处理和转换输入文件,并将处理后的数据存储在 Google Memorystore 中。 但
我正在尝试按照 this guide 从我的本地机器连接到我的 Redis 实例。 ,您可以在其中创建一个 Compute Engine 实例以用于将端口转发到 Redis 实例。 我能够使用以下方法
我在同一地区(欧洲西部 2)有 2 个不同的项目(项目 A 和项目 B)。 我在项目 A 中创建了一个 Memorystore 实例。 因此,我可以从项目 A 连接到 Memorystore,但我也尝
我想知道是否可以执行以下redis命令,但是要在Google Cloud Platform(GCP)Memorystore(这是与Redis兼容的内存数据库)的上下文中执行: https://redi
我遵循了以下两个教程: https://cloud.google.com/go/docs/tutorials/bookshelf-on-compute-engine https://cloud.goo
我的 Redis 主机是 '10.0.0.x',端口是 6379,我确保托管 Node.js pods 和 MemoryStore 的 k8s 集群在同一个地区,但在尝试连接时仍然超时。 var Re
我在 Linux 64 (Fedora 25) 上的 Intellij (CE 2017.1) Scala 控制台中将 Spark 代码作为脚本运行。我在开始时设置了 SparkContext: im
我使用 Sparklung Water 并且正在从 Parquet 文件中读取数据。 我的 spark-default.conf 的部分: `spark.serializer org.apache.s
我了解到 Memorystore 完全支持 Redis 协议(protocol),但有一些限制。请帮助我解决以下挑战。 与 Redis 不同,Memorystore 似乎不支持主从配置来合并读写/只读
大家好,这是我的代码: var express = require('express'); var session = require('express-session'); var app = ex
这可能吗?所有云功能都在 us-central1 中运行,Memorystore 在 us-central1-f 中运行,但内部 IP:10.0.0.3 我看到了诸如 https://cloud.go
我是一名优秀的程序员,十分优秀!