add mapper. add v2 handler. add tag description short and full versions. delete topic[1-5]. #5
Reference in New Issue
Block a user
Delete Branch "edge5modbus"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
@@ -0,0 +13,4 @@}type DemoPlcMetric = DemoPlcPayload & {edge: stringИзбыточная валидация
@@ -0,0 +18,4 @@}function isDemoPlcPayload(value: unknown): value is DemoPlcPayload {if (!value || typeof value !== 'object') {Избыточная валидация
@@ -0,0 +25,4 @@const candidate = value as Partial<DemoPlcPayload>return (typeof candidate.tag === 'string' &&Избыточная валидация
@@ -0,0 +51,4 @@})if (!response.ok) {const text = await response.text()Просто бросить исключение new Error(text)
@@ -0,0 +75,4 @@return}if (!isDemoPlcPayload(value)) {Избыточная валидация
@@ -0,0 +42,4 @@})if (!response.ok) {const text = await response.text()Просто бросить исключение new Error(text)
@@ -0,0 +68,4 @@let value: unknowntry {Обработка ошибок хандлера должна быть не в самом хандлере (это избыточно перегружает его код валидациями так, что при чтении кода теряется смысл и цель происходящего - интерпретация данных для последующей отправки).
Обработка ошибок всех хандлеров должна быть вообще на уровне роутинга входящих пакетов из топиков на хандлеры (app\src\router.ts), а все проблемы/ошибки/несоответствия ожиданиям/ваыпадения из позитивного сценария -- должны бросать исключение
в том числе некорректные данные,
в том числе недоступность или ошибки принимающих сервисов,
в том числе вообще все ошибки, которые не будут покрыты отдельным специальным if.
В этом смысле чем меньше отдельных специальных if - тем лучше, потому что проблемы всё равно обработаются и выловятся уровнем выше, но кода при этом будет меньше.
@@ -0,0 +59,4 @@let values: number[]try {Обработка ошибок хандлера должна быть не в самом хандлере, а выше - на уровне роутинга входящих пакетов из топиков на хандлеры (app\src\router.ts), а все проблемы/ошибки/несоответствия ожиданиям/ваыпадения из позитивного сценария -- должны бросать исключение
в том числе некорректные данные,
в том числе недоступность или ошибки принимающих сервисов,
в том числе вообще все ошибки, которые не будут покрыты отдельным специальным if.
В этом смысле чем меньше отдельных специальных if - тем лучше, потому что проблемы всё равно обработаются и выловятся уровнем выше, но кода при этом будет меньше.
@@ -0,0 +26,4 @@filePath: string | URL}function resolveMappingPath(filePath: string | URL): string {Просто в комментарии в коде напиши, в каком формате и где ты задаёшь и ожидаешь filePath,
соблюдай утвержденный самим собой контракт,
и удали функцию проверки filePath.
@@ -0,0 +38,4 @@const resolvedPath = resolveMappingPath(filePath)let raw: unknowntry {Обработка ошибок хандлера должна быть не в самом хандлере, а выше - на уровне роутинга входящих пакетов из топиков на хандлеры (app\src\router.ts), а все проблемы/ошибки/несоответствия ожиданиям/ваыпадения из позитивного сценария -- должны бросать исключение
в том числе некорректные данные,
в том числе отсутствие каких-либо файлов,
в том числе вообще все ошибки, которые не будут покрыты отдельным специальным if.
В этом смысле чем меньше отдельных специальных if - тем лучше, потому что проблемы всё равно обработаются и выловятся уровнем выше, но кода при этом будет меньше.
@@ -0,0 +59,4 @@const candidate = value as Partial<MappingConfig>return (typeof candidate.edge === 'string' &&Избыточная валидация
@@ -0,0 +67,4 @@)}function isMappingTagEntry(value: unknown): value is MappingTagEntry {Избыточная валидация
@@ -0,0 +79,4 @@)}function getTag(entry: MappingTagEntry): string {вместо этой функции достаточно написать "entry.tag"
9 символов
эта функция не нужна, она избыточна, она перегружает код,
делает его восприятие сложнее,
делает требования у уровню читающего - выше.
И всё это - при нулевой полезности такой функции.
Удали её.
@@ -0,0 +95,4 @@edge: config.edge,tagCount: tags.length,mapValues: (values, timestamp) => {if (values.length !== tags.length) {Избыточная валидация
@@ -0,0 +39,4 @@let raw: unknowntry {raw = JSON.parse(readFileSync(resolvedPath, 'utf8')) as unknownЕсли ты используешь чтение внешнего файла, то этот файл должен существовать
в контейнере, в котором этот код будет задеплоен,
это значит, что копирование этих файлов должно появиться в Dockerfile
или (если они туда уже копируются) хотя бы комментарий в Dockerfile о том, что там что-то такое есть, что программа будет искать, считывать и потом использовать.
@@ -0,0 +15,4 @@function parseValues(payload: Buffer): number[] {let value: unknowntry {избыточная валидация
JSON.parse при некорректной JSON‑строке сам выкинет исключение SyntaxError
@@ -0,0 +3,4 @@export const cloudIngestUrl =process.env.CLOUD_INGEST_URL ?? DEFAULT_CLOUD_INGEST_URLfunction getHeaders(): Record<string, string> {function getHeaders(): Record<string, string> {
return {
'content-type': 'application/json',
'x-api-key': process.env.CLOUD_INGEST_API_KEY
}
}
@@ -0,0 +19,4 @@export function postCloudIngest(body: unknown): Promise<Response> {return fetch(cloudIngestUrl, {method: 'POST',headers: getHeaders(),headers: {
'content-type': 'application/json',
'x-api-key': process.env.CLOUD_INGEST_API_KEY
},
@@ -5,3 +5,2 @@"scripts": {"dev": "tsx watch src/index.ts","start": "tsx src/index.ts","dev": "node --env-file-if-exists=.env ./node_modules/tsx/dist/cli.mjs watch src/index.ts",флаги указывающие на
--env-file=.env--env-file-if-exists=.envпросто пробрасываются к node:
@@ -6,2 +6,2 @@"dev": "tsx watch src/index.ts","start": "tsx src/index.ts","dev": "node --env-file-if-exists=.env ./node_modules/tsx/dist/cli.mjs watch src/index.ts","start": "node --env-file-if-exists=.env ./node_modules/tsx/dist/cli.mjs src/index.ts",Скрипт start тут вообще не нужен.
В продакшне
а переменные окружения возьмутся собственно из окружения (например из портейнера)
@@ -7,2 +6,3 @@"start": "tsx src/index.ts","dev": "node --env-file-if-exists=.env ./node_modules/tsx/dist/cli.mjs watch src/index.ts","start": "node --env-file-if-exists=.env ./node_modules/tsx/dist/cli.mjs src/index.ts","build": "tsc",ну обычно так и оставляют
@@ -0,0 +1,15 @@const DEFAULT_CLOUD_INGEST_URL = 'http://localhost:3101/ingest'Значения по умолчанию для переменных окружения должны быть вынесены в отдельный модуль валидации значений переменных окружения.
Значение переменной CLOUD_INGEST_URL является критическим для такого сервиса как mqtt-ingest, при не указанном значении CLOUD_INGEST_URL сервис не сможет отправлять данные, а значит - выполнять свою функцию, а значит в случае отсутствия значения CLOUD_INGEST_URL - приложение при старте должно ругнуться и не запуститься вовсе, чтобы при деплое на продакшн, это сразу было заметно.