2017-02-10 9 views
0

Я работаю над проектом Node Express/Angular Civic, который интегрирован с сторонним API. Каждый звонок стоит мне 1,00 долларов. Я финансирую определенную часть, но тогда я хотел бы, чтобы запрос POST третьей стороне остановился. Причина в том, что я не хочу тратить тысячи долларов. Сторонний API не поддерживает ограничение скорости.Узел Express завершает запрос POST с помощью счетчика и выдаёт ошибку после x

Я могу создать базу данных или создать auth, но я предпочитаю не идти по этому маршруту или не интегрировать платежный шлюз. Но я не предпочитаю ни одно из этих решений по личным причинам. Я столкнулся с частичным решением/узлом-модулем (ограничение скорости передачи), которое ограничивает IP-адрес. Но это все еще не решает проблему остановки запросов после того, как она достигнет количества звонков.

var RateLimit = require('express-rate-limit'); 

app.enable('trust proxy'); // only if you're behind a reverse proxy (Heroku, Bluemix, AWS if you use an ELB, custom Nginx setup, etc) 

var apiLimiter = new RateLimit({ 
    windowMs: 15*60*1000, // 15 minutes 
    max: 1, // 1 call every 15 minutes 
    delayMs: 0 // disabled 
}); 

// only apply to requests that begin with /api/ 
app.use('/api/', apiLimiter); 

Есть ли лучшие решения/лучшие практики? Это просто побочный проект, который может помочь нескольким людям, но я не хочу ломаться, неся расходы, если многие начнут его использовать. Благодаря!

+0

код [экспресс-скорость-кода предела] (https://github.com/nfriedly/express-rate-limit/blob/master/lib/express-rate-limit.js) является * супер * просто. Конечно, вы могли бы приспособить его к вашим потребностям. Просто изменение функции 'keyGenerator' для возврата некоторой константы (вместо IP-адреса) кажется, что оно должно работать. –

+0

@jordan: Благодарю вас за ответ. Не возражаете ли вы показывать рабочий пример? –

+1

У меня, похоже, нет явного приложения, чтобы я мог просто вставить код, поэтому нет, извините. (Вот почему я разместил комментарий, а не ответ.) –

ответ

0

Как сказал Иордан, установите константу и верните константу. Он будет поддерживать состояние для ограничения скорости по разному IP-адресу.

const keyIp = "127.0.0.1"; 

var limiter = new RateLimit({ 
    windowMs: 2147483647, // store key for node max 
    max: 3, // limit each IP to 1 requests per windowMs 
    // delayMs: 24*60*60*60, // delaying - 24 hours 
    message: "Sorry, the maximum limit of 50 letters sent has been reached. Thank you for participating!", 
    keyGenerator: function (req, res) { 
     return keyIp; 
    } 
}); 

app.use('/api/letter', limiter);