相关疑难解决方法(0)

socket.io和session?

我正在使用快递框架.我想从socket.io访问会话数据.我尝试使用client.listener.server.dynamicViewHelpers数据表达dynamicHelpers,但我无法获取会话数据.有一个简单的方法吗?请参阅代码

app.listen(3000);

var io = require('socket.io');
var io = io.listen(app);

io.on('connection', function(client){
    // I want to use session data here
    client.on('message', function(message){
        // or here
    });
    client.on('disconnect', function(){
        // or here
    }); 
});
Run Code Online (Sandbox Code Playgroud)

session node.js express

95
推荐指数
3
解决办法
8万
查看次数

socket.io身份验证与共享会话数据,io.use()如何工作

灵感来自如何与Socket.IO 1.x和Express 4.x共享会话?我以一些"干净"的方式实现套接字身份验证,不需要使用cookie-parser并从头文件中读取cookie,但很少有项目对我来说不清楚.示例使用last stable socket.io 1.3.6版.

var express      = require('express'),
    session      = require('express-session'),
    RedisStore   = require('connect-redis')(session),
    sessionStore = new RedisStore(),
    io           = require('socket.io').listen(server);

var sessionMiddleware = session({
    store   : sessionStore,
    secret  : "blabla",
    cookie  : { ... }
});

function socketAuthentication(socket, next) {
  var sessionID = socket.request.sessionID;

  sessionStore.get(sessionID, function(err, session) {
      if(err) { return next(err); }

      if(typeof session === "undefined") {
          return next( new Error('Session cannot be found') );
      }
      console.log('Socket authenticated successfully');
      next();
  });
}

io.of('/abc').use(socketAuthentication).on('connection', function(socket) …
Run Code Online (Sandbox Code Playgroud)

javascript node.js express socket.io express-session

18
推荐指数
1
解决办法
1305
查看次数

由于connect不再使用parseCookie方法,我们如何使用express获取会话数据?

在node.js和express中,有很多示例显示如何获取会话数据.

正如您在访问第3个链接时所看到的,它是指向StackOverflow的链接.有一个很好的答案,但正如@UpTheCreek在那些评论中指出的那样,connect不再具有parseCookie方法.我也遇到过这个问题.我发现的所有教程都使用connect的parseCookie方法,现在这个方法不存在.所以我问他如何获取会话数据,他说他不知道最好的方法,所以我想我会在这里发布问题.使用express@3.0.0rc4socket.io,和redis,我们如何获取会话数据并使用它来授权用户?我已经能够使用require('connect').utils.parseSignedCookie;,但是当我这样做时,我总是在握手时收到警告/错误,

warn - handshake error Error
Run Code Online (Sandbox Code Playgroud)

从我所读到的内容来看,听起来这并不是永久的解决方案.


UPDATE

好的,我session.socket.io在我的服务器上工作了.正如我所怀疑的那样,我在授权时陷入困境.我想我可能会以错误的方式解决这个问题,所以请随意纠正我.在我的Redis数据库中,我将获得用户的信息.他们第一次登录时,我想更新他们的cookie,以便它包含他们的用户信息.然后,当他们下次回到网站时,我想检查他们是否有cookie以及用户信息是否存在.如果它不存在,我想将它们发送到登录屏幕.在登录屏幕上,当用户提交信息时,它将针对Redis数据库测试该信息,如果匹配,它将使用用户信息更新cookie.我的问题是这些:

1)如何通过RedisStore更新/更改cookie?

2)看起来会话数据仅保存在cookie中.如果有人关闭了cookie,我如何在页面之间跟踪用户信息?

这是我的适用代码:

//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');

app.configure(function(){
  //...hiding unapplicable code...
  app.use(cookieParser);
  app.use(express.session({secret: 'secret', store: redis_store}));
});

//...hiding code that starts the server and socket.io

var SessionSockets = require('session.socket.io');
var ssockets = new …
Run Code Online (Sandbox Code Playgroud)

authentication session node.js express socket.io

13
推荐指数
2
解决办法
5372
查看次数

仅限套接字IO会话不会持久化

我正在使用Socket.io我正在构建的聊天应用程序.我正在尝试设置会话,以便我可以在会话之间保持用户的登录.

这是相关的代码:

index.js(服务器)

var cookieParser = require('cookie-parser')();
var session = require('cookie-session')({ secret: 'secret' });

app.use(cookieParser);
app.use(session);

io.use(function(socket, next) {
    var req = socket.handshake;
    var res = {};
    cookieParser(req, res, function(err) {
        if (err) return next(err);
        session(req, res, next);
    });
});


io.on('connection', function(socket){

    socket.on('test 1', function(){
        socket.handshake.test = 'banana';
    });

    socket.on('test 2', function(){
        console.log(socket.handshake.test);
    });
});
Run Code Online (Sandbox Code Playgroud)

chat.js(客户端)

var socket = io();

socket.emit('test 1');
socket.emit('test 2');
Run Code Online (Sandbox Code Playgroud)

上面的代码工作,它将banana按预期打印到控制台.但是,如果我像这样评论'test 1':

var socket = io();

// socket.emit('test 1');
socket.emit('test …
Run Code Online (Sandbox Code Playgroud)

session node.js express socket.io

10
推荐指数
1
解决办法
1163
查看次数

Socket.io Express 3会话

有没有一种在Express 3.0中使用Socket.io会话的好方法?一种以安全的方式获取客户会话ID的方法?这样我就可以向会员特定的会员发送通知,并从会员到会员进行私聊?

我在Express 3.0中使用MySQL商店

javascript node.js express socket.io

7
推荐指数
2
解决办法
7058
查看次数

使用快速会话的套接字IO - socket.request.res undefined

我目前正在尝试使用express 4.x和socket io 1.4实现会话管理,引用此答案.问题是快速会话函数的第二个参数是res(响应)对象,它在我的路由中返回'undefined'.这个问题已经过时了还是我做错了什么?

var http = require('http');

var session = require('express-session')(
{
  saveUninitialized : false,
  resave:false,
  secret:'secretstuff',
  cookie : {
    path : '/'
  }
}
);

var express = require('express');

var app = express();

app.use(session)

var http_server = http.createServer(app);

var io = require('./sockets')(http_server,session);
Run Code Online (Sandbox Code Playgroud)

这是我的sockets.js

var Server = require('socket.io');

module.exports = function(http_server, session)
{
   var io = new Server(http_server);

   io.use(function(socket,next){

      //socket.request.res === undefined
      session(socket.request, socket.request.res,next);
   })

}
Run Code Online (Sandbox Code Playgroud)

这是我得到的地方

未捕获的TypeError:参数res是必需的

node.js express socket.io express-session

6
推荐指数
1
解决办法
730
查看次数

使用express中间件时结合socket和express?

有没有办法在快速中间件中获取请求的套接字?

IE:

import express from 'express';
import io from 'socket.io';

const app = express();

// combine app and io somehow ...

// When client makes a GET request to '/emit/to/self', that client's socket will recieve the 'hello:world' message.
app.get('/emit/to/self', (req, res) => {
  req.socket.emit('hello:world', { ... });
  res.send('You just triggered your own socket!')
})
Run Code Online (Sandbox Code Playgroud)

这个想法是 express 中间件具有req.socket引用来自同一客户端的连接套接字的属性。这将允许一些更复杂的用例,例如:

app.post('/image/create', (req, res) => {
  createExpensiveImage({
    onProgress: (progress) => { req.socket.emit('image:progress', { progress }) },
  });
})
Run Code Online (Sandbox Code Playgroud)

客户端将拥有他们刚刚请求通过 API 创建的图像的准确进度条。

javascript sockets node.js express socket.io

6
推荐指数
1
解决办法
4948
查看次数

如何跨多个服务器/工作人员管理 websockets

aiohttp内置了对websockets 的支持。它非常简单并且运行良好。

文档中示例的简化版本是:

async def handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    # Async iterate the messages the client sends
    async for message in ws:
        ws.send_str('You sent: %s' % (message.data,))

    print('websocket connection closed')
Run Code Online (Sandbox Code Playgroud)

在示例中,ws是对与客户端的 websocket 连接的引用。我可以轻松地将此引用放入request.app,就像@Crandel 在这里所做的那样(即全局状态),但不能放在生产应用程序中,因为每个应用程序服务器(甚至每个工作人员)都有自己的app实例。

对此有公认的模式吗?还有其他方法吗?

注意:我不是指会话。我指的是连接。当服务器 B 中的应用程序代码中发生事件时,我想向连接到服务器 A 的客户端发送一条消息,等等。

python websocket channels aiohttp python-3.5

5
推荐指数
1
解决办法
5625
查看次数

Express-session和express-socket.io-session在angular2/typescript环境中不起作用

我有一个script.js设置服务器,如下所示:

var io_session = require("express-socket.io-session");

var e_session = require("express-session")({
    secret: "a-secret",
    resave: true,
    saveUninitialized: true
});

(...)

//this block is the last "io.use" before the socket logic (io.on("connection"))    
io.use(io_session(e_session,{
    autoSave: true
}));
Run Code Online (Sandbox Code Playgroud)

在我的typescript/angular2前端环境中使用以下种子https://github.com/NathanWalker/angular2-seed-advanced我使用Http类在多个服务/组件中执行http请求.

然而,当我尝试再次请求服务器我尝试记录用户会话时,没有记录任何内容...我真的不知道为什么会发生这种情况,因为不仅没有保留用户的会话而且会话没有从http到套接字层系统共享(显然,如果没有创建它也不会被共享).

有谁知道这里可能有什么问题?如果需要我可以提供更多信息,但我真的不知道缺少什么.

session node.js typescript angular

5
推荐指数
1
解决办法
841
查看次数

NodeJS和Socket.IO用户身份验证

我想知道socket.IO身份验证的最佳做法是什么.

Alice发出包含Bobs唯一标识符等参数的事件"消息".Bob在收听socket.on('message')事件时接收消息.

如何防止未经身份验证的用户使用Socket.IO连接到服务器,如何仅向特定用户发出事件?

非常感谢您提供所有建议和答案.彼得

private key public node.js socket.io

3
推荐指数
1
解决办法
5595
查看次数

使用socket.io时,express-session不设置会话cookie

我正在尝试使用socket.io实现身份验证和会话.

经过大量的研究1,我设置了以下使用快速和快速会话.

问题是,express和socket.io连接似乎有不同的会话,因为id我得到的是不同的.

此外,浏览器中没有从我的应用程序中设置cookie(这可能是两个组件创建不同会话的原因?)

我正在使用express 4.13.3express-session 1.12.1和socket.io 1.3.7.

下面是我设置的服务器端代码:

var app = require('express')();
var server = app.listen(80);
var parser = require('body-parser');
var Session = require('express-session');
var io = require('socket.io')(server);
var game = require('./game.js');
var session = Session({
  secret: 'some secret',
  resave: false,
  saveUninitialized: false,
  cookie: {
    'name': 'test',
    httpOnly: false,
    secure: false,
    maxAge: ((60 * 1000) * 60)
  }
});
app.use(parser.urlencoded({
  extended: false
}));
app.use(session);
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, …
Run Code Online (Sandbox Code Playgroud)

cookies node.js express socket.io express-session

1
推荐指数
1
解决办法
3704
查看次数

强制每个用户使用单一 Web 套接字连接有什么缺点吗?

我偶然发现了这篇文章。它谈到

强制每个用户使用单个 Web 套接字连接

它指出,它的一些优点是它使服务器端逻辑不那么复杂。我的问题是

  1. 这样做有什么缺点吗?
  2. 使用 websocket 创建实时应用程序时这样做是常见/良好的做法吗?

- - - - - -编辑 - - - - - - -

  1. 经过一些研究后,我了解到您可以与 socket.io 共享快速会话。这让我想到了这个问题:如果 socket.io 和express 共享会话,那么强制每个用户使用单个 Web Socket 连接是否有任何需要/优势?或者允许用户拥有多个套接字连接是否可以,只要它们都链接到其 user._id 或标识它们的其他内容?

session websocket node.js express socket.io

1
推荐指数
1
解决办法
1814
查看次数