2.0.11 • Published 3 years ago

blackboxserverclass v2.0.11

Weekly downloads
-
License
-
Repository
github
Last release
3 years ago

Проект для быстрого запуска бэкенд сервисов на nodejs и express

Установка

npm install blackboxserverclass

В текущей версии поддерживаются

Базы данных:

MongoDB

Каналы связи:

WebSocket

RabbitMQ

Для конфигурации приложения необходимо в корне разместить файл json

Пример конфига

{
  "server": {
    "port": 8081,
    "compression": {
      "level": 6
    },
    "body_parser": {
      "limit": "50mb",
      "extended": false,
      "parameterLimit": 50000
    },
    "HEADERS": [
      {
        "key": "Access-Control-Allow-Origin",
        "value": "*"
      },
      {
        "key": "Access-Control-Allow-Origin",
        "value": "GET,PUT,POST,DELETE,PATCH,OPTIONS"
      },
      {
        "key": "Access-Control-Allow-Headers",
        "value": "Content-Type"
      }
    ]
  },
  "ws": {
    "use": true,
    "port": 8082
  },
  "rabbitMQ": {
    "use": true,
    "url": "amqp://root:password@172.23.16.51:5672",
    "receive_queue_name": "q_TestUserEvents",
    "receive_exchange": "ex_TestUserEvents",
    "receive_routing_key": "k_TestUserEvents",
    "send_exchange": "ex_TestUserEvents",
    "send_exchange_type": "fanout",
    "send_routing_key": "k_TestUserEvents",
    "prefetch": 10,
    "channel": {
      "receive": {
        "durable": true,
        "autoDelete": false,
        "messageTtl": 600000
      },
      "consume": {
        "noAck": false
      },
      "send": {
        "durable": true
      }
    }
  },
  "DB": {
    "mongo": {
      "use": true,
      "host": "localhost",
      "port": 27017,
      "user_name": "admin",
      "password": "paSw0rd!",
      "db_name": "blackBox",
      "string_options": "?authSource=admin"
    }
  },
  "logger": {
    "INFO": {
      "format": ["DATE", "TYPE", "MSG"],
      "color": {
        "DATE": "bold",
        "TYPE": "blue.bold.bgBlack",
        "MSG": "bold"
      },
      "type": "INFO"
    },
    "ERROR": {
      "format": ["DATE", "TYPE", "MSG"],
      "color": {
        "DATE": "bold",
        "TYPE": "red.bold.bgBlack",
        "MSG": "bold"
      },
      "type": "CRITICAL"
    },
    "WARNING": {
      "format": ["DATE", "TYPE", "MSG"],
      "color": {
        "DATE": "bold",
        "TYPE": "yellow.bold.bgBlack",
        "MSG": "bold"
      },
      "type": "WARNING"
    }
  }
}

Пример использования

const BlackBox = BlackBoxCreateApp("./config.json");

BlackBox
    // подключаем сервер
    .listenedPort()
    // подключаем mongo
    .mongoConnect()
    // подключаем rabbit
    .rabbitConnect(true, (msg) => {
        BlackBox.log(BlackBoxLogEvents.LogInfo, msg.content.toString());
    })
    // отправка сообщений через rabbit
    .sendRabbitMsg(
        `{"date":"2021-09-17T09:20:51.387Z","scenario":"Open door","region":77,"site":108,"device":"00:E0:4C:44:A6:5D","description":"Открыта дверь"}`,
        (isOk, errorMsg) => {
            if (isOk)
                BlackBox.log(
                    BlackBoxLogEvents.LogInfo,
                    "Сообщение отправлено через RabbitMQ"
                );
            else BlackBox.log(BlackBoxLogEvents.LogError, errorMsg);
        }
    )
    // подключаем websocket
    .WSConnect(
        (msg: blackbox.WSMessage) => {
            BlackBox.log(BlackBoxLogEvents.LogInfo, "ws message:" + msg.toString());
        },
        (wss, ws) => {
            ws.send("hello");

            wss.clients.forEach((i) => i.send("hello world!"));
        }
    )
    // подключаем middleware
    .use(
        (
            req: blackbox.Request,
            _res: blackbox.Response,
            next: blackbox.NextFunction
        ) => {
            BlackBox.log(BlackBoxLogEvents.LogInfo, req.url);

            next();
        }
    )
    // переходим на инстанс Express и можем использовать его методы
    .methods()
    .get("/test/:id", (req, res, next) => {
        const { id }: { id: string } = req.params;
        res.status(BlackBoxServerCode.OK).send("OK GET");

        BlackBox.log(BlackBoxLogEvents.LogInfo, id);

        next();
    })
    .post("/testpost", (req, res, next) => {
        const params: any = req.body;
        res.status(BlackBoxServerCode.OK).send("OK POST");

        BlackBox.log(BlackBoxLogEvents.LogInfo, JSON.stringify(params));

        next();
    });

/**
 * Способ создания контроллера с автопривязкой к маршруту
 */

// обязательно помечаем декоратором с общей частью пути
@controller("/api/v1/user")
class UserController extends BaseController {
    // обязательно помечаем декоратором с методом запроса и оставшейся частью пути
    @GET("/get/:id")
    public getUser() {
        const { id } = this.useParams<{ id: number }>();

        return this.response
            .status(ServerCode.OK)
            .send({ id: id, name: "test-user" });
    }

    @POST("/set-name")
    public setUserName() {
        const { name, id } = this.useBody<{ name: string; id: number }>();

        return this.response.status(ServerCode.OK).send({ id, name });
    }
}

@controller("/api/v1/userRemove")
class RemoverController extends BaseController {
    @DELETE("/delete/:id")
    public userRemove() {
        const { id } = this.useParams<{ id: number }>();

        // throw new Error("123123");

        return this.response
            .status(ServerCode.OK)
            .send(`user id ${id} remove!`);
    }
}

// передаем контроллеры в приложение
BlackBox.addControllers([UserController, RemoverController]);