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

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

我的问题是,我不能访问stream中的会话数据(由passport-local修改,并包含login的用户ID)。 我需要它能够限制/授予client.on('message',function(data){..})中的访问权限 基于一些逻辑,但首先重要的是检查消息来自login用户。 在那里,如果我尝试读取ID,它将与req.user._id中的什么有所不同。 似乎有share.js或browserchannel使用一些不同的会话,也许?..

代码如下:

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

在我看来,从代码看,可能有一个解决scheme,不需要黑客模块:

 var browserChannel = require('browserchannel').server; var middleware = browserChannel(options, function(session, req) { if (req.user) { session.user = req.user; } }); app.use(middleware); 

看到这里 。

我有同样的问题,我通过在自定义构造函数中包装browserchannel中间件构造函数来解决它:

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

它避免了必须更改浏览器通道代码。

经过几天的代码检查,我find了一个解决scheme。 如果我们在browserchannel / dist / server.js中查看这一行,我们可以看到使用来自初始请求的一些信息来创build会话。 我们可以通过添加来修改这部分代码

 session = createSession(req.connection.remoteAddress, query, req.headers); // ----------- we add this ------------ session.user = {}; if( req.user ) session.user = req.user; // ------------------------------------ 

这会将用户会话的详细信息从初始请求添加到会话variables。