2014-01-27 2 views
0

У меня есть приложение, которое создает 2 сеанса для каждого пользователя. Я нашел источник проблемы, но я не совсем понимаю, почему это происходит и как это исправить. Скажем, я эшафот пример приложения, как так:Compound/Express JS: Несколько сеансов на пользователя

compound init blah 
cd blah 
npm install 
npm install connect-mongo 
compound g c mytest 

Сделать конфиге/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); 
    }); 
}; 

И в приложение/контроллеры/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'}); 
     } 
    }); 
    }); 
}); 

Обновления routes.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'); 
}; 

Когда я перейти к локального хоста: 3000/mytests и взломать базу данных Монго, я вижу 2 сеансов, созданных. Если я раскомментирую, что вернусь в индекс, я получаю только 1 сеанс, так что это явно http.get, но, возможно, я не понимаю что-то еще? Может ли кто-нибудь объяснить, что происходит?

В идеале, я просто хочу, чтобы я просматривал/mytests, чтобы сделать сеанс, а не любые последующие вызовы, которые он делает.

Примечание: Я понимаю, что этот пример довольно глупый с конечной точкой/getMe, просто возвращающей некоторый JSON, но в моем фактическом приложении он выполняет немного больше и выполняет служебный вызов.

Перекрестные ссылки от CompoundJS и Express Группы Google.

+0

http.get действительно начинает новый сеанс, так как он делает новый HTTP-запрос ** на localhost/getMe. Это ожидаемое поведение. –

+0

Знаете ли вы, каким образом это предотвратить? Я попытался настроить заголовки get с помощью 'Set-Cookie' и' Cookie', но я не очень удался. – incutonez

ответ

0

мне не нравится этот ответ, но я решил опубликовать мое быстрое решение до поры до времени:

я устанавливаю credentials поле в сеансе пользователя, так что я делаю это просто проверяя, существует ли в сеансе/getMe credentials. Если это не так, удалите сеанс. Вот обновленный код:

приложение/контроллеры/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, чтобы не создавать сеанс, было бы потрясающе.

Смежные вопросы