Составной / Экспресс JS: несколько сеансов на пользователя
У меня есть приложение, которое создает 2 сессии для каждого пользователя. Я нашел источник проблемы, но я не до конца понимаю, почему это происходит и как это исправить. Допустим, я создаю пример приложения вроде этого:
compound init blah
cd blah
npm install
npm install connect-mongo
compound g c mytest
Сделайте config/environment.js похожим на это:
module.exports = function (compound) {
var express = require('express');
var app = compound.app;
var secret = 'secret'; // Need this to check if there's been tampering with the session
var MongoStore = require('connect-mongo')(express);
app.sessionStore = new MongoStore({
url: 'mongodb://localhost/development'
});
app.cookieParser = express.cookieParser(secret);
app.configure(function() {
app.use(express.static(app.root + '/public', { maxAge: 86400000 }));
app.set('jsDirectory', '/javascripts/');
app.set('cssDirectory', '/stylesheets/');
app.set('cssEngine', 'stylus');
compound.loadConfigs(__dirname);
app.use(express.bodyParser());
app.use(app.cookieParser);
app.use(express.session({
secret: secret,
store: app.sessionStore,
cookie: {
maxAge: 86400000 // 24 hour session
}
}));
app.use(express.methodOverride());
app.use(app.router);
});
};
И в файле app/controllers/mytests_controller.js измените его так, чтобы оно было таким:
action('getMe', function(data) {
return send({success: true, data: 'got you!'});
});
action(function index(data) {
console.log(data.req.session); // has session data
var http = require('http');
var options = {
host: 'localhost',
port: 3000,
path: '/getMe'
};
//return send({success: true});
http.get(options, function(res) {
var data = '';
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
data = JSON.parse(data);
if (data) {
return send({success: true, data: data});
}
else {
return send({success: false, data: 'data is undefined'});
}
});
});
});
Обновите route.js:
exports.routes = function (map) {
map.resources('mytests');
map.get('getMe', 'mytests#getMe');
// Generic routes. Add all your routes below this line
// feel free to remove generic routes
map.all(':controller/:action');
map.all(':controller/:action/:id');
};
Когда я перехожу к localhost:3000/mytests и открываю базу данных Mongo, я вижу 2 созданные сессии. Если я раскомментирую это возвращение в индексе, я создаю только 1 сеанс, так что это явно http.get, но, может быть, я неправильно понимаю что-то еще? Кто-нибудь может объяснить, что происходит?
В идеале я просто хочу, чтобы я просматривал / mytests, чтобы сделать сеанс, а не какие-либо последующие вызовы, которые он делает.
Примечание: я понимаю, что этот пример довольно глуп, поскольку конечная точка /getMe просто возвращает некоторый JSON, но в моем реальном приложении он выполняет немного больше и выполняет сервисный вызов.
Перекрестная публикация от CompoundJS и Экспресс групп Google.
1 ответ
Мне не нравится этот ответ, но я решил опубликовать свое быстрое решение на данный момент:
Я устанавливаю credentials
поле в сеансе пользователя, так что я просто проверяю, credentials
существует в сеансе / getMe. Если это не так, удалите сеанс. Вот обновленный код:
приложение / контроллеры / mytests_controller.js
action('getMe', function(data) {
// Added this part
var session = data.req.session;
if (session && !session.credentials) {
session.destroy();
}
return send({success: true, data: 'got you!'});
});
action(function index(data) {
// Added this part
var session = data.req.session;
if (session) {
session.credentials = "blah blah blah";
}
var http = require('http');
var options = {
path: '/getMe',
host: 'localhost',
port: 3000
};
// return send({success: true});
http.get(options, function(res) {
var data = '';
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
data = JSON.parse(data);
if (data) {
// make call for proper config file based on cookie.role
return send({success: true, data: data});
}
else {
return send({success: false, data: 'data is undefined'});
}
});
});
});
Как я уже сказал, это не идеально, поэтому я хотел бы услышать другие ответы... возможно, если есть способ отправить сеанс через http.get или даже сказать http.get не создавать сеанс, было бы здорово.