faker-limit.js 938 Bytes
'use strict';

const logger = global.yoho.logger; // eslint-disable-line
const cache = global.yoho.cache.master;
const ONE_DAY = 60 * 60 * 24;

module.exports = (limiter, policy) => {
    const req = limiter.req,
        res = limiter.res,
        next = limiter.next; // eslint-disable-line

    const key = `pc:limiter:faker:${limiter.remoteIp}`;

    if (req.header('X-Requested-With') === 'XMLHttpRequest') {
        cache.decrAsync(key, 1);
    }

    res.on('render', function() {
        cache.incrAsync(key, 1);
    });

    return cache.getAsync(key).then((result) => {
        if (result) {
            if (result > 100) {
                return Promise.resolve(policy); // policy(req, res, next);
            } else {
                return Promise.resolve(true);
            }
        } else {
            cache.setAsync(key, 1, ONE_DAY); // 设置key,1m失效
            return Promise.resolve(true);
        }
    });
};