Authored by 姜枫

同时支持MemcachedSession和CookieSession,可降级

@@ -24,7 +24,10 @@ const favicon = require('serve-favicon'); @@ -24,7 +24,10 @@ const favicon = require('serve-favicon');
24 const uuid = require('uuid'); 24 const uuid = require('uuid');
25 25
26 const pkg = require('./package.json'); 26 const pkg = require('./package.json');
27 -const session = require('client-sessions'); 27 +const CookieSession = require('client-sessions');
  28 +const MemcachedSession = require('yoho-express-session');
  29 +const memcached = require('connect-memcached');
  30 +const MemcachedStore = memcached(MemcachedSession);
28 const _ = require('lodash'); 31 const _ = require('lodash');
29 32
30 const app = express(); 33 const app = express();
@@ -73,14 +76,61 @@ app.use(bodyParser.urlencoded({ @@ -73,14 +76,61 @@ app.use(bodyParser.urlencoded({
73 app.use(cookieParser()); 76 app.use(cookieParser());
74 app.use(compression()); 77 app.use(compression());
75 78
76 -app.use(session({  
77 - requestKey: 'session', 79 +app.use(MemcachedSession({
  80 + proxy: true,
  81 + resave: false,
  82 + saveUninitialized: true,
  83 + unset: 'destroy',
  84 + secret: '82dd7e724f2c6870472c89dfa43cf48d',
  85 + name: 'yohobuy_session',
  86 + cookie: {
  87 + domain: 'yohobuy.com',
  88 + httpOnly: false
  89 + },
  90 + store: new MemcachedStore({
  91 + hosts: config.memcache.session,
  92 + prefix: 'yohobuy_session:',
  93 + reconnect: 5000,
  94 + timeout: 1000,
  95 + retries: 0
  96 + })
  97 +}));
  98 +
  99 +app.use(CookieSession({
  100 + requestKey: 'session2',
78 cookieName: 'yohobuy_session_cookie', 101 cookieName: 'yohobuy_session_cookie',
79 secret: '82dd7e724f2c6870472c89dfa43cf48d', 102 secret: '82dd7e724f2c6870472c89dfa43cf48d',
80 domain: config.cookieDomain 103 domain: config.cookieDomain
81 })); 104 }));
82 105
83 app.use((req, res, next) => { 106 app.use((req, res, next) => {
  107 + if (req.session) {
  108 + let sessionKeys = Object.keys(req.session || {});
  109 + let backSessionKeys = Object.keys(req.session2.sessionBack || {});
  110 +
  111 + if (backSessionKeys.length > sessionKeys.length) {
  112 + let differences = _.difference(backSessionKeys, sessionKeys);
  113 + _.forEach(differences, d => {
  114 + req.session[d] = req.session2.sessionBack[d];
  115 + });
  116 + }
  117 + req.session2.sessionBack = req.session;
  118 + } else {
  119 + req.session = new MemcachedSession.Session(req);
  120 + req.session = _.assign(req.session, req.session2.sessionBack);
  121 + }
  122 +
  123 + if (typeof req.session.reset !== 'function') {
  124 + req.session.reset = function() {
  125 + req.session = null;
  126 + req.session2.reset();
  127 + };
  128 + }
  129 + next();
  130 +});
  131 +
  132 +
  133 +app.use((req, res, next) => {
84 req.user = {}; // 全局的用户数据 134 req.user = {}; // 全局的用户数据
85 req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等 135 req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等
86 req.app.locals.wap = app.locals.wap; // zookeper对象赋值 136 req.app.locals.wap = app.locals.wap; // zookeper对象赋值
@@ -6,7 +6,7 @@ const headerModel = require('../models/header'); @@ -6,7 +6,7 @@ const headerModel = require('../models/header');
6 const logger = global.yoho.logger; 6 const logger = global.yoho.logger;
7 7
8 const forceNoCache = (res) => { 8 const forceNoCache = (res) => {
9 - if (res) { 9 + if (res && !res.finished) {
10 res.set({ 10 res.set({
11 'Cache-Control': 'no-cache', 11 'Cache-Control': 'no-cache',
12 Pragma: 'no-cache', 12 Pragma: 'no-cache',
@@ -47,6 +47,8 @@ exports.notFound = () => { @@ -47,6 +47,8 @@ exports.notFound = () => {
47 */ 47 */
48 exports.serverError = () => { 48 exports.serverError = () => {
49 return (err, req, res, next) => { 49 return (err, req, res, next) => {
  50 + console.log(err);
  51 +
50 forceNoCache(res); 52 forceNoCache(res);
51 53
52 logger.error(`error at path: ${req.url}`); 54 logger.error(`error at path: ${req.url}`);
@@ -24,9 +24,9 @@ @@ -24,9 +24,9 @@
24 "cheerio": "^0.22.0", 24 "cheerio": "^0.22.0",
25 "client-sessions": "^0.7.0", 25 "client-sessions": "^0.7.0",
26 "compression": "^1.6.2", 26 "compression": "^1.6.2",
  27 + "connect-memcached": "^0.2.0",
27 "connect-multiparty": "^2.0.0", 28 "connect-multiparty": "^2.0.0",
28 "cookie-parser": "^1.4.3", 29 "cookie-parser": "^1.4.3",
29 - "cookie-session": "^1.2.0",  
30 "express": "^4.14.0", 30 "express": "^4.14.0",
31 "feed": "^0.3.0", 31 "feed": "^0.3.0",
32 "lodash": "^4.17.2", 32 "lodash": "^4.17.2",
@@ -43,6 +43,7 @@ @@ -43,6 +43,7 @@
43 "request-promise": "^3.0.0", 43 "request-promise": "^3.0.0",
44 "serve-favicon": "^2.3.2", 44 "serve-favicon": "^2.3.2",
45 "uuid": "^2.0.3", 45 "uuid": "^2.0.3",
  46 + "yoho-express-session": "^2.0.0",
46 "yoho-node-lib": "0.2.2", 47 "yoho-node-lib": "0.2.2",
47 "yoho-zookeeper": "^1.0.4" 48 "yoho-zookeeper": "^1.0.4"
48 }, 49 },