Node.js Force share.js使用相同的express会话数据
我有一个简单的Node.js Force share.js使用相同的express会话数据,node.js,session,express,passport.js,share.js,Node.js,Session,Express,Passport.js,Share.js,我有一个简单的express应用程序,它使用session中间件和passport-local中间件。然后我使用share.js和browserchannel通过share.listen(stream)将数据流传输到服务器。所有这些都与文档保持一致 我的问题是,我无法访问流中的会话数据(由passport local修改并包含登录的用户ID)。我需要它能够在client.on('message',function(data){..})中限制/授予访问权限基于某些逻辑,但最重要的是检查消息是否来自
express
应用程序,它使用session
中间件和passport-local
中间件。然后我使用share.js
和browserchannel
通过share.listen(stream)将数据流传输到服务器。所有这些都与文档保持一致
我的问题是,我无法访问流中的会话数据(由passport local修改并包含登录的用户ID)。我需要它能够在client.on('message',function(data){..})中限制/授予访问权限基于某些逻辑,但最重要的是检查消息是否来自登录用户。在这里,如果我尝试读取ID,它将不同于req.user.\u 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);
}));
var-app=express();
var express=需要(“express”);
...
//设置和初始化
使用(cookieParser());
use(bodyParser.json());
app.use(bodyParser.urlencoded({
是的,
限制:1024*1024*10
}));
使用(methodOverride());
应用程序使用(会话)({
机密:global.CONFIG.session.secret,
maxAge:新日期(Date.now()+1000*60*60*24*2),
商店:新MongoStore(global.CONFIG.mongo),
雷萨夫:是的,
saveUninitialized:true
}));
app.use(express.static(uu dirname+'/build');
app.use(passport.initialize());
app.use(passport.session());
应用程序使用(flash());
//创建sharejs服务器实例。
var backend=livedb.client(livedbMongo(global.CONFIG.mongo.url,false));
var share=sharejs.server.createClient({
数据库:后端
});
应用程序使用(浏览器频道(功能)(客户端){
var stream=新的双工({objectMode:true});
stream.\u write=函数(块、编码、回调){
如果(client.state!==“已关闭”){
client.send(chunk);
}
回调();
};
流。_read=函数(){
};
stream.headers=client.headers;
stream.remoteAddress=stream.address;
client.on('message',函数(数据){
console.log(client.id)//在检查代码几天后,我找到了一个解决方案。如果我们查看,我们可以看到会话是使用初始请求中的一些信息创建的。我们可以通过添加
session = createSession(req.connection.remoteAddress, query, req.headers);
// ----------- we add this ------------
session.user = {};
if( req.user )
session.user = req.user;
// ------------------------------------
这会将用户会话详细信息从初始请求添加到会话变量。我有同样的问题,我通过将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());
它避免了必须更改browserchannel代码。从代码来看,似乎有一种解决方案不需要对模块进行黑客攻击:
var browserChannel = require('browserchannel').server;
var middleware = browserChannel(options, function(session, req) {
if (req.user) {
session.user = req.user;
}
});
app.use(middleware);
看