page-cache.js 1.78 KB

'use strict';

const cachePage = require('../../config/cache');
const logger = global.yoho.logger;
const _ = require('lodash');

function urlJoin(a, b) {
    if (_.endsWith(a, '/') && _.startsWith(b, '/')) {
        return a + b.substring(1, b.length);
    } else if (!_.endsWith(a, '/') && !_.startsWith(b, '/')) {
        return a + '/' + b;
    } else {
        return a + b;
    }
}

module.exports = () => {
    return (req, res, next) => {

        function onRender() {
            let route = req.route ? req.route.path : '';
            let appPath = req.app.mountpath;

            if (_.isArray(route) && route.length > 0) {
                route = route[0];
            }

            let key = urlJoin(appPath, route.toString()); // route may be a regexp

            req.app.set('etag', false);

            logger.debug(`route: ${key}   cache = ${cachePage[key]}`);

            // 如果存在cache配置,并且业务代码中没有设置
            if (cachePage[key] && res.get('Cache-Control') !== 'no-cache') {
                res.set({
                    'Cache-Control': 'max-age=' + cachePage[key]
                });
                res.removeHeader('Pragma');
                res.removeHeader('Expires');
            } else if (req.get('X-Requested-With') === 'XMLHttpRequest') {
                res.set('Cache-Control', 'no-cache');
            } else if (res.get('Cache-Control')) { // 业务代码里设了cache, 中断下面的判断
                // nothing
            } else {
                res.set({
                    'Cache-Control': 'no-cache',
                    Pragma: 'no-cache',
                    Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
                });
            }

        }

        res.on('render', onRender);
        next();
    };
};