首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制share.js使用相同的快速会话数据

强制share.js使用相同的快速会话数据
EN

Stack Overflow用户
提问于 2015-02-18 07:17:01
回答 3查看 250关注 0票数 1

我有一个简单的express应用程序,它使用session中间件和passport-local中间件。然后通过share.listen(stream).使用share.jsbrowserchannel将数据流到服务器。都与文档这里保持一致。

我的问题是,我无法访问流中的会话数据(由护照-本地修改并包含已登录的userID )。我需要它能够基于某种逻辑限制/授予client.on(' message ',function(data) {..});中的访问,但首要的是检查消息是否来自已登录的用户。在那里,如果我尝试读取ID,它将与req.user._id内部的potencialy不同。似乎share.js或浏览器通道使用了不同的会话,可能吗?

下面是代码:

代码语言:javascript
复制
var app = express();
var express = require('express');
...

// SETUP AND INIT
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true,
    limit:    1024 * 1024 * 10
}));
app.use(methodOverride());
app.use(session({
    secret:             global.CONFIG.session.secret,
    maxAge:             new Date(Date.now() + 1000 * 60 * 60 * 24 * 2),
    store:              new MongoStore(global.CONFIG.mongo),
    resave:             true,
  saveUninitialized:  true
}));
app.use(express.static(__dirname + '/build')); 
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());


// Create the sharejs server instance.
var backend = livedb.client(livedbMongo(global.CONFIG.mongo.url, false));
var share = sharejs.server.createClient({
  db: backend
});
app.use(browserChannel(function(client) {
  var stream = new Duplex({objectMode: true});

  stream._write = function(chunk, encoding, callback) {
    if (client.state !== 'closed') {
      client.send(chunk);
    }
    callback();
  };

  stream._read = function() {
  };

  stream.headers = client.headers;
  stream.remoteAddress = stream.address;

  client.on('message', function(data) {
    console.log(client.id) // <- I wish it was the same as in req.user._id..
    stream.push(data);
  });
  stream.on('error', function(msg) {
    client.stop();
  });
  client.on('close', function(reason) {
    stream.emit('close');
    stream.emit('end');
    stream.end();
  });

  // Actually pass the stream to ShareJS
  share.listen(stream);
}));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-20 07:10:36

在对代码进行了几天的检查之后,我找到了解决方案。如果我们查看这一行位于browserchannel/dist/server.js中,我们可以看到会话是使用来自初始请求的一些信息创建的。我们可以通过添加

代码语言:javascript
复制
session = createSession(req.connection.remoteAddress, query, req.headers);
// ----------- we add this ------------
session.user = {};
if( req.user )
   session.user = req.user;
// ------------------------------------

这将从初始请求向会话变量添加用户会话详细信息。

票数 0
EN

Stack Overflow用户

发布于 2015-04-20 13:15:24

在我看来,从代码来看,可能有一种解决方案不需要对模块进行黑客攻击:

代码语言:javascript
复制
var browserChannel = require('browserchannel').server;

var middleware = browserChannel(options, function(session, req) {
  if (req.user) {
    session.user = req.user;
  }
});

app.use(middleware);

这里

票数 2
EN

Stack Overflow用户

发布于 2015-04-20 12:55:39

我也遇到了同样的问题,并通过在自定义构造函数中包装浏览器通道中间件构造函数来解决这个问题:

代码语言:javascript
复制
function myMiddlewareConstructor () {

    var request;

    var bcMiddleware = browserChannel(function (client) {
        //here you see the request
    });

    return function (req,res,next) {
        request = req;
        bcMiddleware(req,res,next);
    }

}

app.use(myMiddlewareConstructor());

它避免了更改浏览器通道代码的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28578067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档