Skip to content

A-big-fish-in-a-small-pond/Express-Concurrent-Control

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Express-Concurrent-Control

Express-Concurrent-Control 라이브러리는 Express 미들웨어 라이브러리 입니다.

Alternate Rate Limiters

이 모듈은 기본적으로 다른 프로세스/서버와 상태를 공유하지 않습니다. 좀 더 강력한 솔루션이 필요하다면 외부 라이브러리를 이용하는 것을 추천합니다.

이 모듈은 기본 사항만 다루도록 설계되었으며 지원조차 하지 않았습니다. 작고 가볍지만 강력한 라이브러리를 사용하여 서버를 안정화시킬 수 있습니다.

Installation

From npm:

npm install --save express-access-limit

From Github Releases:

> git clone https://github.com/A-big-fish-in-a-small-pond/Express-Concurrent-Control.git

Usage

Importing

이 라이브러리는 CJS 형태로 제공되며 자바스크립트와 타입스크립트 프로젝트 모두에서 사용할 수 있습니다.

아래는 CJS 형태에서 임포트를 하기 위한 방법입니다.

const { expressLimit } = require("express-access-limit");

Examples

모든 요청에 적용해야 하는 API 전용 서버에서 사용하려면 아래와 같이 사용합니다:

const express = require("express");
const { expressLimit } = require("express-access-limit");
const app = express();

const limiter = expressLimit.expressLimit({
    maxPerMinute: 30,
    resetTime: 60,
    errorCodeNumber: 404,
    type: "default", // 레디스를 사용하고자 하면 redis 를 넣어줍니다.
    handler: (req, res, next) => {
        res.json({ errorHandler: "this page is exceed request page" });
    },
});

/** 레디스를 등록하는 함수입니다. 
레디스가 존재하지 않는다면 Store 의 값을 넣어주지 않으면 Default 로 생성됩니다. */
limiter.setAccessStore();

const conLimiter = expressLimit.createConcurrentQueue(1);

/** middle ware */
app.use(express.json());
app.use(limiter.checkLimitHandler);
app.use(conLimiter.checkLimitHandler);

app.use("/", (req, res) => {
    setTimeout(() => {
        res.json({ success: "end page" });
    }, 1);
});

app.listen(3000, "0.0.0.0", () => {
    console.log("server open");
});

Instruction

expressLimit

expressLimit 은 한 아이피에 대하여 분당 최대 요청할 수 있는 횟수를 제한합니다.

const { expressLimit } = require("express-access-limit");

const limiter = expressLimit.expressLimit({
    maxPerMinute: 30, // 분당 요청할 수 있는 최대 횟수
    resetTime: 60, // 60초로 지정
    errorCodeNumber: 404, // 요청이 초과할 시에 response Code
    type: "default", // 레디스를 사용하고자 하면 redis 를 넣어줍니다.
    handler: (req, res, next) => {
        // 요청 초과 시 callback handler
        res.json({ errorHandler: "this page is exceed request page" });
    },
});

limiter.setAccessStore(); // 기본 저장소를 생성합니다.

다음은 저장소를 레디스로 변경하고자 할 때 사용합니다.

const { expressLimit } = require("express-access-limit");

const limiter = expressLimit.expressLimit({
    maxPerMinute: 30, // 분당 요청할 수 있는 최대 횟수
    resetTime: 60, // 60초로 지정
    errorCodeNumber: 404, // 요청이 초과할 시에 response Code
    type: "redis", // 레디스를 사용하고자 하면 redis 를 넣어줍니다.
    handler: (req, res, next) => {
        // 요청 초과 시 callback handler
        res.json({ errorHandler: "this page is exceed request page" });
    },
});

limiter.setAccessStore(redisclient); // 레디스 클라이언트를 지정합니다.

레디스 외의 다른 라이브러리를 사용하거나 추가하여 세션을 제어할 때는 클래스를 구현하여 인스턴스를 집어넣어주시면 됩니다. 클래스 생성 방법은 아래와 같습니다.

class Store {
    constructor(store) {
        this.store = store;
    }

    async get(...rest) {
        print("this is prototype...");
        return null;
    }

    async set(...rest) {
        print("this is prototype...");
        return null;
    }
}

저장소 클래스를 만들어서 setAccessStore 메소드를 통해 저장소를 변경하면 되겠습니다.

createConcurrentQueue

createConcurrentQueue 은 서버가 허용할 수 있는 최대 동시 접속을 제한합니다.

const conLimiter = expressLimit.createConcurrentQueue(2); // 최대 2명까지 동시 접속이 가능

Issues and Contributing

If you encounter a bug or want to see something added/changed, please go ahead and open an issue! If you need help with something, feel free to start a discussion!

HomePage

Github © Page

NPM © Page

License

MIT © Park and Kim

MIT © Park and Kim

About

This library is available on Express. It is used for simultaneous access management.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published