Authored by 姜枫

Merge branch 'release/node-gzip' into feature/11.11

@@ -13,6 +13,7 @@ const yohoLib = require('yoho-node-lib'); @@ -13,6 +13,7 @@ const yohoLib = require('yoho-node-lib');
13 13
14 const express = require('express'); 14 const express = require('express');
15 const path = require('path'); 15 const path = require('path');
  16 +const compression = require('compression');
16 const bodyParser = require('body-parser'); 17 const bodyParser = require('body-parser');
17 const cookieParser = require('cookie-parser'); 18 const cookieParser = require('cookie-parser');
18 const favicon = require('serve-favicon'); 19 const favicon = require('serve-favicon');
@@ -65,6 +66,7 @@ app.use(bodyParser.urlencoded({ @@ -65,6 +66,7 @@ app.use(bodyParser.urlencoded({
65 extended: false 66 extended: false
66 })); 67 }));
67 app.use(cookieParser()); 68 app.use(cookieParser());
  69 +app.use(compression());
68 70
69 app.use(session({ 71 app.use(session({
70 name: 'yohobuy_session_cookie', 72 name: 'yohobuy_session_cookie',
@@ -94,6 +96,7 @@ try { @@ -94,6 +96,7 @@ try {
94 const setPageInfo = require('./doraemon/middleware/set-pageinfo'); 96 const setPageInfo = require('./doraemon/middleware/set-pageinfo');
95 const devtools = require('./doraemon/middleware/devtools'); 97 const devtools = require('./doraemon/middleware/devtools');
96 const seo = require('./doraemon/middleware/seo'); 98 const seo = require('./doraemon/middleware/seo');
  99 + const pageCache = require('./doraemon/middleware/page-cache');
97 100
98 // YOHO 前置中间件 101 // YOHO 前置中间件
99 app.use(subDomain()); 102 app.use(subDomain());
@@ -107,16 +110,8 @@ try { @@ -107,16 +110,8 @@ try {
107 app.use(devtools()); 110 app.use(devtools());
108 } 111 }
109 112
110 - // set no cache  
111 - app.use((req, res, next) => {  
112 - if (req.get('X-Requested-With') === 'XMLHttpRequest') {  
113 - res.set('Cache-Control', 'no-cache');  
114 - }  
115 - next();  
116 - });  
117 - 113 + app.use(pageCache());
118 require('./dispatch')(app); 114 require('./dispatch')(app);
119 -  
120 app.all('*', errorHanlder.notFound()); // 404 115 app.all('*', errorHanlder.notFound()); // 404
121 116
122 // YOHO 后置中间件 117 // YOHO 后置中间件
@@ -19,8 +19,11 @@ app.on('mount', function(parent) { @@ -19,8 +19,11 @@ app.on('mount', function(parent) {
19 }); 19 });
20 app.use(global.yoho.hbs({ 20 app.use(global.yoho.hbs({
21 extname: '.hbs', 21 extname: '.hbs',
  22 +<<<<<<< HEAD
22 defaultLayout: 'layout', 23 defaultLayout: 'layout',
23 layoutsDir: doraemon, 24 layoutsDir: doraemon,
  25 +=======
  26 +>>>>>>> release/node-gzip
24 partialsDir: path.join(__dirname, 'views/partial'), 27 partialsDir: path.join(__dirname, 'views/partial'),
25 views: path.join(__dirname, 'views/action'), 28 views: path.join(__dirname, 'views/action'),
26 helpers: Object.assign({}, global.yoho.helpers, helpers) 29 helpers: Object.assign({}, global.yoho.helpers, helpers)
@@ -13,6 +13,7 @@ var app = express(); @@ -13,6 +13,7 @@ var app = express();
13 var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root 13 var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
14 14
15 app.on('mount', function(parent) { 15 app.on('mount', function(parent) {
  16 +
16 delete parent.locals.settings; // 不继承父 App 的设置 17 delete parent.locals.settings; // 不继承父 App 的设置
17 Object.assign(app.locals, parent.locals); 18 Object.assign(app.locals, parent.locals);
18 }); 19 });
@@ -44,7 +44,7 @@ function doPassportCallback(openId, nickname, sourceType, req, res) { @@ -44,7 +44,7 @@ function doPassportCallback(openId, nickname, sourceType, req, res) {
44 refer: refer 44 refer: refer
45 }); 45 });
46 } else if (result.code === 200 && result.data.uid) { 46 } else if (result.code === 200 && result.data.uid) {
47 - return AuthHelper.syncUserSession(result.data.uid, req, res).then(() => { 47 + return AuthHelper.syncUserSession(result.data.uid, req, res, result.data.session_key).then(() => {
48 return refer; 48 return refer;
49 }); 49 });
50 } 50 }
@@ -161,7 +161,7 @@ const local = { @@ -161,7 +161,7 @@ const local = {
161 } 161 }
162 user.session = refer; 162 user.session = refer;
163 user.href = refer; 163 user.href = refer;
164 - AuthHelper.syncUserSession(user.uid, req, res).then(() => { 164 + AuthHelper.syncUserSession(user.uid, req, res, user.session_key).then(() => {
165 res.json({ 165 res.json({
166 code: 200, 166 code: 200,
167 data: user 167 data: user
@@ -60,7 +60,12 @@ class Auth { @@ -60,7 +60,12 @@ class Auth {
60 return api.get('', param); 60 return api.get('', param);
61 } 61 }
62 62
63 - static syncUserSession(uid, req, res) { 63 + static syncUserSession(uid, req, res, sessionKey) {
  64 + if (sessionKey) {
  65 + global.yoho.cache.set(`java_session_key:${uid}`, sessionKey).catch(() => {
  66 + global.yoho.logger.error('write session key fail');
  67 + });
  68 + }
64 return Auth.profile(uid).then((userInfo) => { 69 return Auth.profile(uid).then((userInfo) => {
65 let token = sign.makeToken(uid); 70 let token = sign.makeToken(uid);
66 let data = userInfo.data; 71 let data = userInfo.data;
  1 +
  2 +'use strict';
  3 +
  4 +const SECOND = 1;
  5 +const MINUTE = 60 * SECOND;
  6 +
  7 +const cachePage = {
  8 + '/': 5 * MINUTE,
  9 +
  10 + // 频道页
  11 + '/boys': 30 * SECOND,
  12 + '/woman': 30 * SECOND,
  13 + '/kids': 30 * SECOND,
  14 + '/lifestyle': 30 * SECOND,
  15 +
  16 + // 商品详情页
  17 + '/product/\\/pro_([\\d]+)_([\\d]+)\\/(.*)/': 30 * MINUTE,
  18 +
  19 + // 逛
  20 + '/guang': 1 * MINUTE,
  21 + '/guang/info/index': 10 * MINUTE,
  22 + '/guang/author/index': 1 * MINUTE,
  23 + '/guang/tags/index': 1 * MINUTE,
  24 +
  25 + // 领券中心
  26 + '/activity/coupon/floor': 5 * MINUTE,
  27 +
  28 + // 商品列表
  29 + '/product/list/index': 5 * MINUTE,
  30 + '/product/index/index': 5 * MINUTE,
  31 +
  32 + // 秒杀列表
  33 + '/product/seckill': 30 * SECOND,
  34 +
  35 + // 秒杀详情
  36 +
  37 + // sale
  38 + '/product/sale': 5 * MINUTE,
  39 +
  40 + '/product/outlet': 30 * SECOND,
  41 +
  42 + '/product/index/brand': 2 * MINUTE
  43 +
  44 +};
  45 +
  46 +module.exports = cachePage;
  1 +
  2 +'use strict';
  3 +
  4 +const path = require('path');
  5 +const cachePage = require('../../config/cache');
  6 +const logger = global.yoho.logger;
  7 +
  8 +module.exports = () => {
  9 + return (req, res, next) => {
  10 +
  11 + function onRender() {
  12 + let route = req.route ? req.route.path : '';
  13 + let appPath = req.app.mountpath;
  14 + let key = path.join(appPath, route.toString()); // route may be a regexp
  15 +
  16 + req.app.set('etag', false);
  17 +
  18 + logger.debug(`route: ${key} cache = ${cachePage[key]}`);
  19 +
  20 + // 如果存在cache配置,并且业务代码中没有设置
  21 + if (cachePage[key] && res.get('Cache-Control') !== 'no-cache') {
  22 + res.set({
  23 + 'Cache-Control': 'max-age=' + cachePage[key]
  24 + });
  25 + res.removeHeader('Pragma');
  26 + res.removeHeader('Expires');
  27 + } else if (req.get('X-Requested-With') === 'XMLHttpRequest') {
  28 + res.set('Cache-Control', 'no-cache');
  29 + } else {
  30 + res.set({
  31 + 'Cache-Control': 'no-cache',
  32 + Pragma: 'no-cache',
  33 + Expires: new Date(1900, 0, 1, 0, 0, 0, 0)
  34 + });
  35 + }
  36 +
  37 + }
  38 +
  39 + res.on('render', onRender);
  40 + next();
  41 + };
  42 +};
@@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
21 "bluebird": "^3.4.6", 21 "bluebird": "^3.4.6",
22 "body-parser": "^1.15.2", 22 "body-parser": "^1.15.2",
23 "cheerio": "^0.22.0", 23 "cheerio": "^0.22.0",
  24 + "compression": "^1.6.2",
24 "connect-multiparty": "^2.0.0", 25 "connect-multiparty": "^2.0.0",
25 "cookie-parser": "^1.4.3", 26 "cookie-parser": "^1.4.3",
26 "cookie-session": "^1.2.0", 27 "cookie-session": "^1.2.0",
@@ -38,7 +39,11 @@ @@ -38,7 +39,11 @@
38 "request-promise": "^3.0.0", 39 "request-promise": "^3.0.0",
39 "serve-favicon": "^2.3.0", 40 "serve-favicon": "^2.3.0",
40 "uuid": "^2.0.3", 41 "uuid": "^2.0.3",
  42 +<<<<<<< HEAD
41 "yoho-node-lib": "^0.1.24", 43 "yoho-node-lib": "^0.1.24",
  44 +=======
  45 + "yoho-node-lib": "0.1.27",
  46 +>>>>>>> release/node-gzip
42 "yoho-zookeeper": "^1.0.3" 47 "yoho-zookeeper": "^1.0.3"
43 }, 48 },
44 "devDependencies": { 49 "devDependencies": {