node expressjs websocket会话传递

时间:2017-04-21 01:16:56

标签: node.js express websocket

我的代码列在下面,但我想解释一下我的思考过程并让每个人都纠正我,因为我一直在努力尝试以正确的方式完成这项工作。

我已经在这方面苦苦挣扎了一段时间(5天+),我还没有找到一种直接的方式在网上做到这一点。

所以我有两个独立的节点应用程序在运行。一个运行just-js,另一个运行websocket服务器。我可能只是一个完整的傻瓜,但这里就是。

我设置了一个mongo会话商店。当用户成功进行身份验证时,会话会被创建,我可以将用户重定向到登录页面。当会话存在时,当用户点击“auth-page”时,我可以自动将用户重定向到“登录页面”。

现在我的理解是,当在mongo-store中创建会话时,会在Web浏览器上创建一个cookie,并且这个cookie会在页面生成的每个请求中到达服务器,而express-js将很好地处理我内心的魔力,我可以使用像

这样的东西
app.post('/', function (req, res) {

}

req变量通过express填充会话ID,因为express获取了cookie并对其进行了解码。

接下来的部分是事情是冒险的,无论如何任何建议都将是一个巨大的帮助。 我想要做的是,在我的app.post('/'...等)里面重定向到另一个页面。这个页面加载了一个客户端,它启动了我的websocket服务器的websocket连接,我的websocket服务器能够使用相同的session-id。

所以这就是事情。我的express-js http服务器作为一个单独的进程运行,它有自己的端口,我的websocket服务器作为一个单独的进程运行,也有自己的端口。在网上进行了足够的研究之后,我发现了许多消息来源,表明当我的浏览器连接到我的websocket服务器时,它会将标题中的cookie发送到我的websocket服务器。所以在浏览器中,我有一些运行的javascript代码:

let clientSocket = new WebSocket("ws://socket.server.address:5005");

然后从我的节点websocket服务器,我可以解析socket.upgradeReq.headers,获取cookie,并使用它来获取会话ID,我在业务。这描述了我在下面的代码中试图实现的目标。我成功地做到了这一点,但是在尝试解析cookie时遇到了不同的问题。

有时候我会得到一个单一的cookie&有时候,我会收到多个采用

形式的cookie
cookie_name1=cookie_value1;cookie_name2=cookie_value2;
cookie_name3=cookie_value3;cookie_name4=cookie_value4;
cookie_name5=cookie_value5;

有时候我会得到一个单一的cookie&有时候,我会收到多个采用

形式的cookie

问题1 - 为什么我会将多个cookie发送到我的websocket服务器?这是否严格由浏览器决定?如果有的话,我该怎么办?

问题2 - 饼干总是以这种格式出现吗?我讨厌分号分隔符样式来改变并破坏我的代码

问题3 - 在审核我的代码后,我的思考过程可以建议并指导我完成一个完全不同/更好的实现来实现这一目标吗?你能建议我换零件吗?我的目标是能够启动多个不同的websocket服务器和Web服务器和它们之间的负载平衡。我试图找到一种可靠的方法来做到这一点,以便我的代码不会破坏...我的节点应用程序只是非常脆弱,某些方向会有所帮助。似乎对于nodejs,尽管它在2017年已经成熟,但良好的信息仅存在于stackoverflow,github问题线程和irc.freenode上,并且我将其中的一些分类为基本...

使用的包和版本

web-server package versions
---------------
express@4.15.2
express-session@1.15.2
mongodb@2.2.26
cookie-parser@1.4.3
body-parser@1.17.1
connect-mongodb-session@1.3.0

socket-server package versions
---------------
uws@0.14.1

下面是我的代码

webserver.js

'use strict';

const bodyparser = require('body-parser');
const cookieparser = require('cookie-parser');
const express = require('express');
const app = express();
const express_session = require('express-session');
const connect_mongo = require('connect-mongodb-session')(express_session);

const port = process.env.NODE_WEBSERVER_PORT;
const _ = require('underscore');

const mongo_store = new connect_mongo({
    uri: 'mongodb://mongo1.weave.local:27017/sessiondb',
    collection: 'sess'
});

const session_time = 1000 * 60 * 5 ;  // 5 minute(s)

app.use(express_session({
    secret: 'superman',
    cookie: {
        maxAge: session_time,
       httpOnly: false
        },
    store: mongo_store,
    resave: false,
    saveUninitialized: false,
    name: 'inspect_the_deq',
    httpOnly: false
}));

app.use(bodyparser.urlencoded({ extended: false }))
app.use(bodyparser.json());

app.set('view engine', 'pug');
app.set('views', __dirname+'/pugs')
app.use(express.static(__dirname + '/com/js'));
app.use(express.static(__dirname + '/com/asset'));

const mongo = require('mongodb').MongoClient;
const mongo_url = 'mongodb://mongo1.weave.local:27017/main';

let account = null;
let database = null;

mongo.connect(mongo_url, function(err, db) {
    let collection = db.collection('account');
    account = collection;
    database = db;
});

app.get('/', function (req, res) {

    if(req.session.user){
        const user = req.session.user;
        res.render('main', {message: 'user '+user+' logged in' });
        console.log('session found logging you on');
    }else{
        res.render('login', {message: 'Login'});
        console.log('no session exists');
    }
});

app.post('/', function (req, res) {

    const user = req.body.username, pass = req.body.password;
    const seconds = session_time;

    account.findOne({username: user, password: pass }, function(err, document) {
        if( document !== null ){
            req.session.user = user;
            req.session.cookie.expires = new Date(Date.now() + seconds);
            req.session.cookie.signed = true;
            res.render('main', {message: 'user '+user+' logged in'});
            console.log('some id is '+req.session.id);
            console.log('cookie id is '+req.session.cookie);
            console.log('sess id is '+req.sessionID);
        }else
            res.render('login', {message: 'Login', login_error: 'invalid username or password'});
    });
});

app.listen(port, function () {
    console.log('http server '+port);
});

此处的套接字服务器代码

'use strict';

const _ = require('underscore');
const uwsPlugin = require('uws').Server;
const socket_port = process.env.NODE_SOCKET_PORT;
const ws = new uwsPlugin({ port: socket_port, maxPayload: 0 });
//const Meepack = require('./core/meepack');

const cookieparser = require('cookie-parser');
const express_session = require('express-session');
const connect_mongo = require('connect-mongodb-session')(express_session);
const mongo_store = new connect_mongo({
    uri: 'mongodb://mongo1.weave.local:27017/sessiondb',
    collection: 'sess'
});

ws.on('connection', function connection(socket) {
    'use strict';
    console.log('client verification process ');
    let headers = Object.keys(socket.upgradeReq.headers);
    let upgradeReq = Object.keys(socket.upgradeReq.headers.cookie);
    let cookie = socket.upgradeReq.headers.cookie;
    //use the cookie here to get the session_id and do whatever you want
    socket.on('close', function close(e) {
        console.log('connection closed');
    });

    socket.on('message', function close(data) {
        'use strict';
    });

});

0 个答案:

没有答案