我的代码列在下面,但我想解释一下我的思考过程并让每个人都纠正我,因为我一直在努力尝试以正确的方式完成这项工作。
我已经在这方面苦苦挣扎了一段时间(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&有时候,我会收到多个采用
形式的cookiecookie_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';
});
});