index.js 1.1 KB
'use strict';

const _ = require('lodash');
const logger = global.yoho.logger;
const qpsLimiter = require('./rules/qps-limit');
const captchaPolicy = require('./policies/captcha');

const IP_WHITE_LIST = [
    '106.38.38.146',
    '218.94.75.58'
];

const limiter = (rule, policy, context) => {
    return rule(context, policy);
};

module.exports = (req, res, next) => {
    let remoteIp = req.get('X-Forwarded-For') || req.connection.remoteAddress;

    if (remoteIp.indexOf(',') > 0) {
        let arr = remoteIp.split(',');

        remoteIp = arr[0];
    }

    const excluded = _.includes(IP_WHITE_LIST, remoteIp);
    const enabled = !_.get(req.app.locals, 'pc.sys.noLimiter');

    // 判断获取remoteIp成功,并且开关未关闭
    if (enabled && remoteIp && !excluded) {
        const context = {
            req: req,
            res: res,
            next: next,
            remoteIp: remoteIp
        };

        Promise.all([
            limiter(qpsLimiter, captchaPolicy, context)
        ]).then((results) => {
            logger.info(results);
        });
    } else {
        return next();
    }
};