Продажа квадроциклов, снегоходов и мототехники
second logo
Пн-Чт: 10:00-20:00
Пт-Сб: 10:00-19:00 Вс: выходной

+7 (812) 924 3 942

+7 (911) 924 3 942

Содержание

Определить сигнализацию или иммобилайзер по брелку ЖК и LED брелки

Брелок ANQUANBAO

ANQUANBAO

Брелок Agilon AL-2000

Agilon AL-2000

Брелок Agilon AL-2000CSRT

Agilon AL-2000CSRT

Брелок Alligator CM 30 G

Alligator CM 30 G

Брелок Alligator TD 320

Alligator TD 320

Брелок Alligator TD 355

Alligator TD 355

Брелок CENMAX Vigilant ST-9A

CENMAX Vigilant ST-9A

Брелок Clifford Matrix LCD

Clifford Matrix LCD

Брелок Jaguar JX1000

Jaguar JX1000

Брелок Jaguar JX2000

Jaguar JX2000

Брелок KGB VS4000

KGB VS4000

Брелок Legendford 400

Legendford 400

Брелок Scher-Khan Logicar 1

Scher-Khan Logicar 1

Брелок Scher-Khan Magicar 8

Scher-Khan Magicar 8

Брелок Sheriff ZX-1050, ZX-910, ZX-925

Sheriff ZX-1050, ZX-910, ZX-925

Брелок Sheriff ZX940

Sheriff ZX940

Брелок StarLine B92

StarLine B92

Брелок StarLine A91, B9

StarLine A91, B9

Брелок StarLine A62

StarLine A62

Брелок Starline A2

Starline A2

Брелок Tomahawk LR1000, LR1010

Tomahawk LR1000, LR1010

Брелок Viper 5000

Viper 5000

Брелок Viper 500XV

Viper 500XV

Брелок Viper 571XV

Viper 571XV

Брелок Viper 7901

Viper 7901

Брелок Alligator D830

Alligator D830

Брелок Alligator D930

Alligator D930

Брелок Alligator D950, 970, 975

Alligator D950, 970, 975

Брелок Alligator M1000

Alligator M1000

Брелок Alligator M1700

Alligator M1700

Брелок Alligator M2000, M2200

Alligator M2000, M2200

Брелок Alligator S400

Alligator S400

Брелок Alligator S450, S475

Alligator S450, S475

Брелок Alligator S800

Alligator S800

Брелок Alligator S500, S550, S575

Alligator S500, S550, S575

Брелок Alligator S725RS

Alligator S725RS

Брелок APS 5000

APS 5000

Брелок Bruin BR-970

Bruin BR-970

Брелок Cenmax 8

Cenmax 8

Брелок Cenmax ST10

Cenmax ST10

Брелок Cenmax ST5

Cenmax ST5

Брелок Cheetah CM-215

Cheetah CM-215

Брелок Clifford 300x

Clifford 300x

Брелок MS dialog

MS dialog

Брелок Jaguar ONE

Jaguar ONE

Как определить сигнализацию по брелку: узнайте модель сейчас же

Всем привет! Как-то раз один из моих друзей приобрел хорошую поддержанную иномарку, полный фарш, все дела). Разумеется, установлена была сигнализация, которая спустя пару месяцев начала барахлить. Товарищ мой – человек серьезный, сразу взялся устанавливать причину. Сейчас, уже не вспомнить в чем там было дело, какая-то мелочь. Так вот, собравшись приобрести запасную часть, он столкнулся с проблемой. Какой-либо инструкции или документации на данную модель в салоне обнаружено не было, только ДУ-пульт. Естественно спустя время он оказался у меня на пороге со словами, «Макс, как определить сигнализацию по брелку?» Так, мы начали думать вместе…

Содержание

С чего начинать идентификацию?

Разумеется, первое, что пришло на ум, это под микроскопом разглядеть тот самый брелок. Зачастую на корпусе можно обнаружить выгравированную эмблему производителя или модель сигнализации. В нашем случае, какие-либо опознавательные знаки отсутствовали вовсе, пришлось узнавать дальше. Оказывается, у большинства производителей автомобильной сигнализации имеется свой, эксклюзивный стиль. Например, дизайн или другие конструктивные особенности. Проявив смекалку, мы обнаружили некоторую последовательность в продукции основных торговых марок по выпуску автосигнализации.

  • Pharaon – покрывает корпус покрытием очень напоминающее мрамор.
  • Mongoose – использует фирменную гравировку, силуэт бегущего мангуста.
  • Sirio Tank – выливает корпус в форме танковой башни.
  • Cobra – логично, что брелки этой марки похожи на капюшон змеи.

Как видите друзья будь у вас брелок любого вышеописанного бренда, идентифицировать его удастся уже при первом знакомстве. Однако, мы с другом оказались в другой ситуации, ни мрамора, ни змей, ни уж тем более танков на нашем брелке не было. Поэтому нужно было найти другой способ дабы установить личность заморской системы.

О всемогущий интернет…

Если сразу модель сигнализации узнать не вышло, смело открывайте ноутбук и выходите в сеть! Мы так и поступили, и самое главное – не прогадали. Представляете в интернете существуют специализированные сайты, где собраны, наверное, все существующие брелки на земле. По крайней мере мне так показалось, был там и наш слава богу. Радости товарища не было предела, ну любит он все доводить до концаJ.

  1. autoelectric.ru – здесь расположена огромная база подписанных фотографий, найти свой пульт не составит труда, тем более, что данные постоянно обновляются.
  2. www.ugona.net – более сложный ресурс с возможностью задавать параметры поиска, такие как: количество кнопок, наличию светодиодов или дисплея.

Из всей кучи страниц, которые мы перелистали, я выделил два действительно хороших, пользуйтесь на здоровье!

Заключение

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

С уважением, Максим Марков!

Определить модель сигнализации по брелку

Брелоки и антенны

Модель

Совместимость

Брелоки

Антенны

Harpoon h2

h3
TW-7010
TW-9020
TW-9030
TZ-7010
TZ-9020
TZ-9030

TZ-7010
TZ-9020
Z3
Z5

Harpoon h3

h2
TW-7010
TW-9020
TW-9030
TZ-7010
TZ-9020
TZ-9030

TZ-9030

Harpoon
BS-1000

BS-2000

BS-2000

BS-2000

BS-1000

BS-1000

Harpoon
BS-3000

BS-1000 доп.
BS-2000 доп.

BS-1000
BS-2000

Tomahawk
X3
X5

X5
X3
Z3
Z5

X5
X3
TW-7010
TW-9020

Tomahawk
D-700

S-700
TW-7000
TW-9000
TW-9010
LR-950
TZ-9010
SL-950
D-900

D-900
TW-9010

Tomahawk
D-900

S-700
TW-7000
TW-9000
TW-9010
LR-950
TZ-9010
SL-950
D-700

D700
TW-9010
TW-7000
TW-9000
LR-950

Tomahawk
TW-4000

TW-7010
TW-9020
TW-9030
LR-1010
TZ-7010
TZ-9020
TZ-9030
h2
h3

TW-7010
TW-9020
X3
X5
LR-1010

Tomahawk
TW-7000

TW-9000
TW-9010
LR-950
TZ-9010
SL-950
D-900
D-700
S-700

TW-9000
TW-9010
LR-950
D-700
D-900

Tomahawk
TW-7010

TW-7010
TW-9020
TW-9030
TZ-7010
TZ-9020
TZ-9030
LR-1010
h2
h3

TW-7010
TW-9020
LR-1010
X3
X5

Tomahawk
TW-7100

TW-9100

TW9100

Tomahawk

TW-9000

TW-9010

TW-9000
TW-9010
TW-7000
LR-950
TZ-9010
SL-950
D-700
D-900
S-700

TW-7000
TW-9000
TW-9010
LR-950
D-700
D-900

Tomahawk
TW-9020

TW-7010
TW-9030
LR-1010
TZ-7010
TZ-9020
TZ-9030
h2
h3

TW-7010
LR-1010
X3
X5

Tomahawk

TW-9030

TW-7010
TW-9020
TZ-7010
TZ-9020
TZ-9030
h2
h3

НЕТ

Tomahawk
TW-9100

TW-7100

TW-7100

Tomahawk

LR-950

TW-9000
TW-9010
TW-7000
TZ-9010
SL-950
D-700
D-900
S-700

TW-7000
TW-9000
TW-9010
D-700
D-900

Tomahawk
LR-1010

TW-7010
TW-9020
TW-9030
TZ-7010
TZ-9020
TZ-9030
h2
h3

TW-7010
TW-9020
X3
X5

Tomahawk

CL-350

CL-500

CL-500
CL-350

Tomahawk

CL-550

НЕТ

Tomahawk

CL-700

TZ-7010
TZ-9020
TZ-9030
TW-7010
TW-9020
TW-9030
h2
h3

Tomahawk
S-700

TW-7000
TW-9000
TW-9010
LR-950
TZ-9010
SL-950
D-700
D-900

TZ-9010
SL-950

Tomahawk

SL-950

TZ-9010
S-700
TW-7000
TW-9000
LR-950
D-700
D-900

S-700
TZ-9010

Tomahawk
TZ-7010
TZ-9020

TZ-7010
TZ-9020
TZ-9030
LR-1010
TW-7010
TW-9020
TW-9030
h2
h3

TZ-7010
TZ-9020
Z3
Z5
h2

Tomahawk

TZ-9010

SL-950
TW-9000
TW-9010
SR-950
D-700
D-900
S-700

S-700
SL-950

Tomahawk
TZ-9030
TZ-9030 — 24V

TZ-7010
TZ-9020
LR-1010
TW-7010
TW-9020
TW-9030
h2
h3

h3

Tomahawk
Z1

НЕТ

НЕТ

Tomahawk
Z3
Z5

Z3
Z5
X3
X5

Z3
Z5
TZ-7010
TZ-9020
h2

Tomahawk
7.1

9.3
9.3 — 24V
7.2
9.7
9.7 CAN

7.2 CAN

Tomahawk

7.2

нет

нет

Tomahawk
7.2 CAN

7.1
9.3
9.3 — 24V
9.7
9.7 CAN

7.1

Tomahawk
9.3
9.3 — 24V

9.7
9.7 CAN
7.1
7.2 CAN

9.7
9.7 CAN

Tomahawk
9.5

9.9

9.9

Tomahawk
9.7

7.1
7.2 CAN
9.3
9.3 — 24V
9.7 CAN

9.3
9.3 — 24V
9.7 CAN

Tomahawk
9.7 CAN

7.2 CAN
7.1
9.3
9.3 — 24V
9.7

9.3
9.3 — 24V
9.7

Tomahawk
9.9

9.5

9.5

Tomahawk
G-9000
G-9000 CAN

G-9000 CAN
G-9000

G-9000 CAN
G-9000

Tomahawk
8.1

нет

нет

Tomahawk
10.1

нет

нет

Определяем сигнализацию Старлайн по брелку

Брелки Старлайн в отличии от Томагавка делают на каждую модель свой брелок и как правило на другую модель он не пропишется, по этому что бы точно определить модуль, нужно посмотреть на ЖК дисплей, кнопки и антенну сигнализации.

Как определить модель сигнализации Старлайн по брелку

Брелок без запуска Старлайн А6 – корпус серого цвета, узкая антенна – иконки на дисплее с синей окантовкой, антенна черная с надписью «Call»

Брелок а8 или а9 – с запуском двигателя серый корпус, узкая антенна, иконки на ЖК с черной окантовкой, антенна черная с надписью «Call»

Брелок А9 прописывается на сигнализацию Старлайн а6!!!!

Брелок Старлайн Б6 – без запуска двигателя – самая левая иконка «Anti Hijack» на дисплее машинка «порш», английские иконки.

Брелок Б9 с запуском двигателя – Левая иконка на Жк будильник, машинка порш и английские иконки. Существует 2 разновидности Б9 – В тёмно-синем корпусе и черном, модели полностью одинаковые но брелоки друг на друга не пишутся, поэтому если у вас Брелок Б9 в черном корпусе, то и заменить вы можете только на Б9 в черном корпусе.

Антенна на модели А6-А9 – Б6 и Б9 одна и та же – черная с надписью Call.

Диалоговые брелки А61 без запуска – Жк дисплей с русскими иконками, левая иконка «пистолет»

Брелок а91 с запуском двигателя в корпусе тёмно-синего цвета с защитным покрытием, русские иконки, самая левая иконка часы и вентилятор.

Юбилейные серии А61 4х4 и а91 4х4 корпус брелка от Д94, брелоки 4-х кнопочные но последняя кнопка не активна, на эти системы прописываются без потери функционала а61 и а91 соответственно.

Антенна А91 тёмно-синего цвета без надписей красный антенный вход подходит на а61 и А91

Брелок А62 без запуска двигателя – конки с правой стороны «музыка»

Брелок А92 без запуска двигателя – конки с правой стороны «вентилятор»

Брелок Б62 без запуска двигателя левая иконка «пистолет»

Брелок Б92 без запуска двигателя левая иконка «часы»

Антенна А92 -62-Б92-:»тёмно-синяя – черный вход.

Брелки а94 и Б94 такие же как и а92 и Б92 , но имеют настройку датчика удара и наклона, прописываются на А92 и Б92

Антенна А94 черная с красным входом для кабеля – подходит на всю четвертую серию включая Е90 –а93, а63.

Системы Е61 и Е91 и А36, А39 спец серия для СТО в которую был включен обходчик штатного иммобилйзера. Ничем не отличается от Е60- Е90. А63 и А93. Брелок А93 прописывается на А63. Новый брелок Е93 прописывается на все предыдущие системы е60, 61, 63, Е90, 91 и Е93

Документация по ОС Mongoose

Оптимизация библиотеки mbedTLS

Mongoose OS использует библиотеку mbedTLS от ARM с несколькими патчами:

  • Использование ОЗУ каждым подключением. По умолчанию mbedTLS выделяет> 32 КБ ОЗУ для каждого TLS-соединения. ОС Mongoose использует динамические буферы, что снижает использование ОЗУ на одно соединение до 1 КБ.
  • Интеграция криптографического чипа
  • ATECC608A. Этот патч заставляет mbedTLS выгружать шифрование на аппаратный чип.
  • Динамическая загрузка сертификатов ЦС.По умолчанию mbedTLS загружает все сертификаты CA в RAM. Наш патч загружает его по требованию, экономя много оперативной памяти. ОС Mongoose хранит сертификаты CA в файле ca.pem, где вы можете добавить сертификат CA вашего сервера, не увеличивая использование оперативной памяти.

ESP32 шифрование флэш-памяти

Важно шифрование кода и данных на флэш-памяти:

  • защищает от реверс-инжиниринга
  • он защищает учетные данные устройства, такие как закрытые ключи, при копировании и использовали для доступа к облаку
  • Чип

ESP32 оснащен встроенными функциями безопасности, одна из которых прозрачное шифрование SPI flash — подробности см. Документация Espressif.

Mongoose OS упрощает настройку шифрования флэш-памяти ESP32. По умолчанию прошивка ОС Mongoose отображается в виде обычного текста:

.
  mos flash esp32 # Flash Mongoose OS на ESP32
mos flash-read --arch esp32 0x1

2000 - # Дамп области файловой системы

Команда flash-read выгружает флэш-память в файл, и вывод может показать, что содержимое не зашифровано. Поэтому чувствительный такую ​​информацию, как закрытые ключи TLS, можно легко украсть с флэш-памяти.В этом случае мы видим не зашифрованную часть файловой системы устройства.

Чтобы включить шифрование флэш-памяти, используйте команду esp32-gen-key . Это включает флеш-шифрование для следующей прошивки (и устанавливает efuses):

  mos -X esp32-gen-key flash_encryption_key fe.key \
  --esp32-enable-flash-encryption --dry-run = false
mos flash esp32 --esp32-файл-ключ шифрования fe.key  

Это необратимо — после того, как флеш-шифрование включено, вы не сможете вернуться.

Обратите внимание на дополнительный флаг --esp32-encryption-key-file fe.key для команды flash . Отныне для перепрошивки устройства требуется ключевой файл. В случае утери ключевого файла перепрошить модуль невозможно. После включения флеш-шифрования выполняется самая первая загрузка. шифрование, которое занимает время — до минуты. Последующая загрузка будет нормальной, без шифрования.

После того, как флеш-память зашифрована, ее можно проверить с помощью команды

flash-read чтобы убедиться, что нет текстовых частей:

  mos flash-read --arch esp32 0x1

2000 -

Рекомендуется использовать отдельный ключ для каждого устройства.В efuses необходимо включить шифрование (это делается автоматически с помощью esp32-gen-key ), и его можно проверить, запустив:

  mos esp32-efuse-get  

Устройство с включенным шифрованием должно отображать flash_crypt_cnt: 0x01

Если вы действительно хотите указать ключ шифрования, возможно, ваш вариант использования проще с общим ключом, вам необходимо установить предохранители напрямую

  mos esp32-efuse-set flash_encryption_key = 0x000000000000000000000000000000000000000000000000000000000000 flash_encryption_key.RD = 1 flash_encryption_key.RD = 1 flash_crypt_cnt = 1 flash_crypt_cnt.WD = 1 JTAG_disable = 1 download_dis_encrypt = 1 download_dis_decrypt = 1 download_dis_cache = 1 flash_crypt_config = 0xf 

замещающего соответствующую шестнадцатеричную строку для ключевого параметра, т.е. 0xdabf6bcfcab9d642f22c240e7eda58acf54d305b373990f27ab8241d557a99a8

Криптографический чип

ATECC608A

Часто платы IoT не имеют встроенного механизма защиты от вспышек. Любой, у кого есть физический доступ к устройству, может прочитать всю флешку, включая любую конфиденциальную информацию, такую ​​как закрытые ключи TLS.

Крипто-чипы

предназначены для смягчения этого. Их основная функция — хранение закрытых ключей, которые нельзя прочитать. Закрытые ключи хранятся внутри крипто-чипа, и все крипто-операции которые требуют закрытого ключа, выгружаются на крипто-чип, который выполняет операция и возвращает результат.

Криптографический чип

ATECC608A разработан с дополнительными аппаратными механизмами защиты чтобы затруднить извлечение ключа. Это впечатляющий аппарат с много уровней защиты, и, что немаловажно, это довольно недорого, стоимостью менее 80 центов за штуку.

Подключение (пример ESP8266 NodeMCU)

Получите ATECC608A — либо как плату ATCRYPTOAUTH-XPRO, которая не требует пайку, или ATECC608A, требующий пайки.

Функция ATECC608A контакт ESP8266 контакт Вывод NodeMCU штифт ATCRYPTOAUTH
SDA 5 10 (GPIO12) D6 11 (желтый)
SCL 6 9 (GPIO14) D5 12 (белый)
ЗЕМЛЯ 4 Любой GND Любой GND 19 (черный)
VCC 8 Любая 3V3 Любая 3V3 20 (красный)

Электропроводка для ATCRYPTOAUTH-XPRO:

Электропроводка для голых костей ATECC608A:

Руководство по установке

Mongoose OS имеет встроенную поддержку Микросхема безопасности ATECC608A.Этот раздел представляет собой краткое руководство по его настройке и эксплуатации. Для более подробной информации, особенно о конфигурации микросхемы, пожалуйста, см. документацию Microchip.

  1. Чипы отправляются с завода без конфигурации. Будет обнаружен пустой чип, но операции шифрования завершатся сбоем с кодом 0xf4 . Microchip предоставляет собственные инструменты конфигурации, но mos включает основные команды для получения и установки конфигурации в виде файла YAML. Для разработки вы можете использовать наши образец конфигурации.Чтобы установить его, используйте следующие команды mos :
  mos atca-set-config atca-test-config.yaml --dry-run = false
Конфигурация mos atca-lock-zone --dry-run = false
Данные mos atca-lock-zone --dry-run = false  

Примечание: это нужно сделать только один раз, и после блокировки конфигурацию микросхемы больше нельзя изменить. Вы можете сбросить конфигурацию чипа с помощью mos atca-get-config --format = yaml .

Примечание 2: образец конфигурации очень разрешающий и только подходит для разработки и тестирования, НЕ для производственного развертывания.Пожалуйста, обратитесь к Руководство Microchip и другая документация, чтобы придумать более безопасный конфигурация (мы можем помочь и с этим — задайте вопрос на нашем форуме).

  1. Сгенерировать сертификат и ключ как обычно. Пример ниже показывает самоподписанный сертификат, но, конечно, это не обязательно. Важно то, что что это сертификат ECDSA с использованием кривой P256, так как это то, что чип поддерживает.
  openssl ecparam -out ecc.key.pem -name prime256v1 -genkey
openssl req -new -subj \
  "/ C = IE / L = Dublin / O = ACME Ltd / OU = Testing / CN = test.acme.com "\
  -sha256 -key ecc.key.pem -text -out ecc.csr.tmpl
openssl x509 -in ecc.csr.pem -text -out ecc.crt.pem \
  -req -signkey ecc.key.pem -days 3650  
  1. Записать сгенерированный ключ в устройство. Предполагая, что вы используете наши образец конфигурации, описанный в предыдущем разделе, это двухэтапный процесс:

    3.1. Сгенерируйте и установите ключ шифрования ключа в слот 4

  openssl rand -hex 32> slot4.key
mos -X atca-set-key 4 слот 4.ключ --dry-run = false
AECC508A rev 0x5000 S / N 0x012352aad1bbf378ee, конфигурация заблокирована, данные заблокированы
Слот 4 - это слот закрытого ключа без ECC.
SetKey успешно.  

3.2. Установите фактический ключ ECC в слот 0

  mos -X atca-set-key 0 ecc.key.pem --write-key = slot4.key --dry-run = false
AECC508A rev 0x5000 S / N 0x012352aad1bbf378ee, конфигурация заблокирована, данные заблокированы

Слот 0 - это слот закрытого ключа ECC.
Разобранный ЧАСТНЫЙ КЛЮЧ EC
Зона данных заблокирована, будет выполняться зашифрованная запись через слот 4 с использованием slot4.ключ
SetKey успешно.  
  1. Загрузить сертификат в устройство
  mos put ecc.crt.pem  
  1. Задайте конфигурацию HTTP-сервера для использования загруженного сертификата и частного ключ из слота устройства 0:
  Установка конфигурации mos http.listen_addr =: 443 \
  http.ssl_cert = ecc.crt.pem http.ssl_key = ATCA: 0
Получение конфигурации ...
Установка новой конфигурации ...
Сохранение и перезагрузка ...  

При запуске вы должны увидеть в журнале устройства:

  HTTP-сервер mgos_sys_config_init_http запущен на [443] (SSL)  

А при соединении с браузером:

  ATCA: 2 ECDH получить pubkey ok
ATCA: 0 Знак ECDSA ОК
ATCA: 2 ECDH ок  

Настройка TLS на сервере HTTP / WS устройства

Системный HTTP-сервер имеет следующие параметры конфигурации (мы добавили комментарии к выходным данным инструмента mos ):

  mos config-get http
{
  "enable": true, # Установите значение false, чтобы отключить HTTP-сервер по умолчанию
  "hidden_files": "", # Шаблон глобуса для файлов, которые нужно скрыть от обслуживания
  "listen_addr": "80", # Порт для прослушивания
  "ssl_ca_cert": "", # сертификат CA для взаимной аутентификации TLS
  "ssl_cert": "", # Файл сертификата
  "ssl_key": "", # Файл закрытого ключа
  "upload_acl": "*" # ACL, для которого файлы могут быть загружены через / upload
}  

Чтобы настроить односторонний SSL / TLS на системном HTTP-сервере, создайте сертификат, загрузите сертификат и файл ключа на устройство и измените конфигурацию HTTP-сервера.

Как создать самоподписанный сертификат

  openssl req -nodes -new -x509 -keyout key.pem -out cert.pem
mos put cert.pem
mos положить ключ.pem
набор конфигурации mos http.listen_addr = 443 http.ssl_key = key.pem http.ssl_cert = cert.pem
mos Wi-Fi WIFI_NET WIFI_PASS
curl -k https: // IP_ADDRESS # Протестируйте!  

Если вы хотите использовать двусторонний (двусторонний) TLS с устройством, выполните следующую процедуру, чтобы использовать самоподписанный сертификат:

Самоподписанный сертификат для взаимного TLS

  # Общие параметры
SUBJ = "/ C = IE / ST = Dublin / L = Docks / O = MyCompany / CN = howdy"

# Создать CA
openssl genrsa -out ca.ключ 2048
openssl req -new -x509 -days 365 -key ca.key -out ca.crt \
  -subj / C = IE / ST = Дублин / L = Доки / O = mos / CN = me

# Создать сертификат клиента
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj $ SUBJ
openssl x509 -req -days 365 -in client.csr -CA ca.crt \
  -CAkey ca.key -set_serial 01 -out client.crt

# Создать сертификат сервера
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj $ SUBJ
openssl x509 -req -days 365 -in server.csr -CA ca.crt \
  -CAkey ca.key -set_serial 01 -out server.crt  

Когда закончите, скопируйте сгенерированные файлы на устройство и перенастройте сервер:

  # Загрузить серверный ключ, сертификат и сертификат на устройство
mos put ca.crt
mos поставьте server.key
mos положить server.crt

# Обновить настройки HTTP-сервера для использования взаимного TLS
набор конфигурации mos http.ssl_ca_cert = ca.crt http.ssl_cert = server.crt \
  http.ssl_key = server.key http.listen_addr = 443  

С этого момента устройство должно быть доступно через безопасный веб-узел:

  # Настроить WiFi
mos Wi-Fi WIFI_NET WIFI_PASSWORD
mos --cert-файл client.crt \
    --key-файл client.key \
    --port wss: // IPADDR / rpc \
    позвоните в RPC.List  

Устройство как сетевой клиент

Подключенным устройством может быть сетевой клиент, сетевой сервер или и то, и другое. За Например, если устройство предоставляет интерфейс RESTful, оно действует как сеть сервер. Если устройство подключается к серверу MQTT, оно действует как сетевой клиент.

Не запускайте сетевой сервер на своем устройстве по следующим причинам:

  • Сделать DoS-атаку на устройство легко, создав множество сетевых подключений.Сказать, у устройства 40k свободной оперативной памяти, и каждое соединение занимает 10k, затем 4 подключений достаточно для отказа в обслуживании
  • Устройство должно реализовывать механизмы аутентификации и авторизации, которые потенциально уязвимы
  • Код сетевой службы может быть уязвимым
  • Если для связи используется TLS, время установки соединения может быть большой из-за медленного процессора, что приводит к задержкам и неудобствам для пользователей
  • Управление сертификатами TLS для локальной связи может быть нетривиальным

С другой стороны, когда устройство действует как клиент, эти проблемы исчезают:

  • Взломать устройство напрямую невозможно, потому что оно не выставить любую конечную точку сети
  • Устройство не заботится об аутентификации и авторизации — это все обрабатываются на стороне облака, а защищенные сервисы, такие как Google IoT Core или AWS IoT будет хорошим выбором для облачного сервера
  • Единственная сущность, которой устройство должно доверять, — это облачный сервер, который обрабатывается отраслевым стандартом TLS
  • Нет необходимости поддерживать много сетевых подключений, потому что один безопасный подключения к облачному бэкэнду достаточно как для управления, так и для потоков данных.Это экономит драгоценные ресурсы

Защита RPC

RPC — это механизм ОС Mongoose для удаленного управления. Каждый раз инструмент mos запускается в режиме командной строки или в режиме графического интерфейса, RPC используется для запроса устройство — по последовательному или удаленно. Отображение списка файлов, показывающих, что аппаратная платформа, количество свободной оперативной памяти, переключение GPIO — это все RPC.

Когда новое устройство мигает, оно находится в состоянии по умолчанию, когда все RPC разрешены для всех.Несколько механизмов доступно для ограничения доступа к сервисам RPC:

  • Включить аутентификацию — какие пользователи могут
  • Включить авторизацию — что могут делать разрешенные пользователи
  • Отключить RPC для данного канала
  • Отключить все функции RPC

Включить аутентификацию

Mongoose OS реализует аутентификацию с использованием механизма Digest, так же, как HTTP дайджест-аутентификация нанимает. Это работает так — верно для обоих Дайджест HTTP и RPC Mongoose OS:

  • Клиент отправляет запрос
  • Если аутентификация не включена, сервер отвечает
  • Если аутентификация включена и запрос клиента содержит данные аутентификации, ответы сервера
  • Если аутентификация включена и клиентский запрос не имеет аутентификации данных, сервер отправляет обратно ошибку, запрашивая аутентификацию со случайным nonce для предотвращения атак повторного воспроизведения
  • Клиент повторяет запрос с данными аутентификации, созданными с помощью nonce сервера

В случае HTTP данные аутентификации отправляются в Авторизация: Заголовок HTTP.В случае RPC данные аутентификации отправляются как дополнительный ключ auth в кадре RPC.

Аутентификация включается путем создания файла паролей в htdigest стандартный формат и установка его в конфигурации. Формат файла паролей такой же, как и для дайджеста HTTP. аутентификации, и им может управлять Apache htdigest .

Это пример, который создает файл паролей с пользователем joe , загружает этот файл на устройство и настраивает RPC для его использования:

  htdigest -c rpc_auth.txt myproduct Джо
mos положить rpc_auth.txt
mos config-set rpc.auth_domain = myproduct
mos config-set rpc.auth_file = rpc_auth.txt  

Включить авторизацию

аутентифицированных RPC можно проверить по Файл ACL, чтобы определить, может ли данный аутентифицированный пользователь получить доступ к RPC:

  mos put rpc_acl.json
mos config-set rpc.acl_file = rpc_acl.json  

Формат ACL аналогичен ACL управления конфигурацией. Вот пример rpc_acl.json файл:

  [
  {"method": "FS. *", "ch_type": "GCP", "acl": "*"}
  {"метод": "SYS. *", "ch_type": "WS_in", "acl": "*"}
  {"метод": "FS. *", "acl": "+ user1, -user2"},
  {"метод": "*", "acl": "- *"}
]  

Обратите внимание, что вы можете дополнительно указать ACL на основе канала связи с помощью параметра ch_type. Если вы сомневаетесь, к какому каналу относится ваш желаемый канал, отправьте на устройство вызов RPC и найдите строку журнала, аналогичную mgos_rpc.c: 389 с именем «RPC.List» через «WS_in», ACL: «*» .Обычно удобная для человека переменная указывается в каждой библиотеке rpc, т.е. для GCP она выглядит так:

  static const char * mgos_rpc_channel_gcp_get_type (struct mg_rpc_channel * ch) {
  (недействительно) ч;
  вернуть «GCP»;
}  

Отключить RPC для данного транспорта

Если транспорт отключен, то все! Транспорты RPC являются последовательными, HTTP / RESTful, Веб-сокет, MQTT, Bluetooth. Это отключает транспорт HTTP:

  mos config-set rpc.http.enable = false  

Отключить все функции RPC

Это наиболее радикальный метод.Удалите rpc-common library и все остальные rpc- * с вашего mos.yml . Это полностью удаляет функциональность RPC из прошивки.

Обратите внимание, однако, что безопасность RPC определяется безопасностью его транспорт. Например, RPC через сервис AWS IoT использует безопасную аутентификацию. Механизм AWS IoT, использующий взаимный TLS и продуманную инфраструктуру политик. Таким образом, шифрование, аутентификация и авторизация канала RPC являются предоставляется AWS. Такой канал RPC очень безопасен.Обратный пример будет RPC через простой HTTP / RESTful, без аутентификации и не заблокирован авторизацией, широко открыт для мира.

Альтернативой RPC для удаленного управления может быть механизм предоставляемые облачным сервером — например, устройство AWS IoT shadow, или двойник устройства Azure, или объекты конфигурации / состояния Google IoT Core и т. д.

редактировать этот документ Учебное пособие по типам, проверке и запросам

Mongoose с примерами

В этом учебном пособии MongoDB мы собираемся понять, как работать с типами схемы Mongoose .Как эффективно определять типы схем Кроме того, мы научимся применять настраиваемую проверку в данных MongoDB, определяя проверку в типах схем Mongoose с помощью встроенных валидаторов Mongoose. Мы также рассмотрим некоторые базовые запросы Mongoose, например: create , find, findById, findOne, updateOne, updateMany, findoneandupdate, save, deleteMany, deleteOne и научитесь управлять коллекцией и документами в приложении Node.

Типы схемы Mongoose используются для определения конкретной структуры данных для документа MongoDB.Типы схемы полезны для управления определением значений пути по умолчанию, строк, чисел, проверки, методов получения, средства установки, выбора полей и общих запросов.

Mongoose Краткое введение

Mongoose — это инструмент моделирования объектных данных (ODM) для MongoDB и Node.js. Mongoose регулирует связь между данными, обеспечивает проверку схемы. Mongoose помогает установить связь между объектом в коде и устанавливает эти объекты в MongoDB.

Словарь MongoDB

Термин Описание
База данных Организованный сбор одного или нескольких наборов данных.
Коллекция Это один или несколько комплектов документов.
Документ Структурированный набор документов в форме пары ключ / значение, такой же, как у объектов JSON.
Схема Тип структуры данных для String, Number, Date, Buffer, Boolean, Mixed, ObjectID, Array в документе MongoDB.
Модель Конструкторы MongoDB — это причудливые конструкторы, которые принимают определенную схему для создания экземпляра документа MongoDB.Модель помогает в поиске и создании документов из коллекции.

Настройка приложения Node с Mongoose ODM и Express

Мы настроим базовое приложение Node, чтобы показать вам, как настроить Типы схемы Mongoose, проверка и запросы .

Выполнить команду в терминале для создания нового проекта узла с нуля:

  mkdir node-app && cd node-app  

Запустить команду для создания файла package.json :

  npm init  

Затем установите необходимые пакеты для нашего приложения Node.

  npm install express mongoose - сохранить
  

Установите соединение MongoDB в приложении Node

На этом этапе мы создадим папку db и создадим файл database.js в той же папке, чтобы установить соединение MongoDB в нашем приложении Node.

  mkdir db && cd db && touch database.js  

В файл db / database.js добавьте следующий код, чтобы установить MongoDB DATABASE => mongodatabase .

  module.exports = {
  db: 'mongodb: // localhost: 27017 / mongodatabase'
};  

Создать файл Server.js

Выполните приведенную ниже команду из корневой папки проекта, чтобы создать файл server.js , мы импортируем пакеты express и mongoose вместе с базой данных Mongo и некоторой базовой конфигурацией сервера узлов.

  touch server.js  

Затем добавьте следующий код в файл server.js :

  const express = require ('express'),
    мангуст = требовать ('мангуст'),
    dataBaseConfig = require ('./ db / database ');



mongoose.Promise = global.Promise;
mongoose.connect (dataBaseConfig.db, {
    useNewUrlParser: true
}). then (() => {
        console.log ('База данных успешно подключена')
    },
    error => {
        console.log ('Не удалось подключиться к базе данных:' + ошибка)
    }
)


const app = экспресс ();


app.get ('*', (req, res, next) => {
    setImmediate (() => {
        далее (новая ошибка («Что-то пошло не так»));
    });
});

app.use ((error, req, res, next) => {
    
    res.json ({
        сообщение: ошибка.сообщение
    });
});



const port = process.env.PORT || 4000;
const server = app.listen (порт, () => {
    console.log ('Подключено к порту' + порт)
})  

Приведенный выше код позаботится о следующих вещах:

  • Установлено соединение с базой данных MongoDB с помощью Mongoose.
  • Реализована базовая обработка ошибок с помощью Express.
  • Настройте Express PORT с 4000

На следующем шаге запустите MongoDB, набрав в терминале следующую команду:

  mongod  

Откройте другой терминал и выполните следующую команду, чтобы запустить Express сервер:

  узловой сервер
  

Определить типы схемы и модель Mongoose

В Mongoose модель и схема связаны друг с другом, и между обоими терминами есть техническая разница.Схема Mongoose связана со структурой документа, тогда как модель Mongoose отвечает за извлечение и чтение документов из базы данных MongoDB.

Позвольте нам понять типы схем Mongoose простыми словами.

Каждые типов схем в Mongoose ссылаются на коллекцию и организуют структуру документа. Он поддерживает проверку данных, запросы, выбор полей и т. Д. Ниже приведены допустимые типы схем, поддерживаемые Mongoose:

  • String
  • Number
  • Date
  • Buffer
  • Boolean
  • Mixed
  • ObjectID
  • Array

следующая команда для определения папки модели и файла схемы в нашем проекте узла:

  mkdir model && cd model && touch user.js  

Затем в файле user.js мы определим допустимые типы схемы и создадим модель для схемы пользователя .

Требовать Mongoose

Для создания схемы вызовите ODM Mongoose в верхней части файла user.js :

  const mongoose = require ('mongoose');
const Schema = mongoose.Schema;  

Определение типов схем Mongoose

Как вы можете видеть в приведенном ниже примере, мы определили типы схем почти для всех возможных типов данных для userSchema .Первое свойство, которое мы объявили _id для схемы пользователя и сопоставили его с типом схемы Mongoose ObjectId, он также известен как первичный ключ в MongoDB.

В нашем примере мы определили номер мангуста , буфер (загрузка файла), логическое значение (истина / ложь), массив, типы схемы даты . Мы также создали коллекцию пользователей для MongoDB, которую мы можем проверить в базе данных MongoDB.

 
let userSchema = new Schema ({
    _id: новая схема.Типы.ObjectId,
    имя: {
        firstName: строка,
        lastName: String
    },
    Эл. адрес: {
        тип: String
    },
    мобильный: {
        тип: Число
    },
    аватар: {
        тип: Буфер
    },
    isAccountVerified: {
        тип: Boolean
    },
    socialProfiles: [{
            twitter: String
        },
        {
            facebook: String
        },
        {
            linkedin: Строка
        },
        {
            instagram: String
        }
    ],
    аккаунт создан: {
        тип: Дата,
        по умолчанию: Дата.в настоящее время
    }
}, {
    
    коллекция: 'пользователи'
})  

Создание модели Mongoose

Теперь мы успешно создали пользовательскую схему, и мы собираемся создать модель Mongoose из userSchema.

 
const User = mongoose.model ('Пользователь', userSchema);  

Использование метода сохранения Mongoose

Мы видели, как модель создается и подключается к схеме Mongoose. На следующем шаге мы поймем, как сохранить данные в MongoDB с помощью метода сохранения Mongoose с использованием модели User и типа userSchema.

  let John = новый пользователь ({
    _id: новый mongoose.Types.ObjectId (),
    имя: {
        firstName: 'Джон',
        lastName: "Лань"
    },
    электронная почта: '[email protected]',
    мобильный: 012020,
    isAccountVerified: true,
    socialProfiles: [{
            twitter: 'https://twitter.com/johndoe'
        },
        {
            facebook: 'https://facebook.com/johndoe'
        },
        {
            linkedin: 'https://linkedin.com/johndoe'
        },
        {
            instagram: 'https: // instagram.com / johndoe '
        }
    ]
})



John.save ((error) => {
    if (error) {
        return console.log (`Что-то пошло не так: $ {error}`);
    }
    console.log («Документ успешно сохранен!»);
})  

Используйте встроенные валидаторы схемы Mongoose

На предыдущем шаге мы сохранили данные Джона в базе данных MongoDB с помощью метода Mongoose save () . Mongoose поставляется с потрясающими встроенными валидаторами схемы и дополнительными свойствами. На этом шаге мы углубимся и разберемся с дополнительными функциями для строк, чисел, даты и того, как применять встроенную проверку типа схемы Mongoose .

String Дополнительные свойства:

Давайте взглянем на некоторые модификаторы, и модификаторы помогают изменить значение перед сохранением его в базе данных.

Свойство Описание
нижний регистр Логическое, преобразование строкового значения в нижний регистр перед сохранением в базе данных.
верхний регистр Boolean, преобразование строкового значения в верхний регистр перед сохранением в базе данных.
trim Boolean, всегда ли вызывать .trim () для значения.

Что такое валидаторы?

Валидаторы проверяют значение перед сохранением его в базе данных.

Свойство Описание
соответствие RegExp, он создает валидатор wh

Как создать REST API с помощью Express и Mongoose — Рахман Фадхиль

Это руководство поможет вам для создания RESTful API с помощью Node.js, Express и Mongoose с функциями CRUD. Я ожидаю, что у вас есть базовые знания о Node.js и JavaScript. Если да, то вперед!

Предварительные требования

Это программное обеспечение необходимо сначала установить на вашем компьютере:

Начало работы

Единственное, что нам нужно для начала работы с этим проектом, — это пустая папка с инициализированным пакетом npm. Итак, создадим!

  $ mkdir учить-экспресс
$ cd Learn-Express
$ npm init -y  

Теперь давайте установим несколько полезных пакетов.

  $ npm установить экспресс-мангуст  

Здесь мы устанавливаем Express для нашей веб-платформы и mongoose для взаимодействия с нашей базой данных MongoDB.

Я также опубликовал исходный код всего этого проекта на моем GitHub. Идите и клонируйте это на свой компьютер.

  $ git clone https://github.com/rahmanfadhil/learn-express-mongoose.git  

Базовый экспресс-сервер

Теперь мы можем приступить к созданию index.js и создать простой сервер Express.

index.js

  const express = require ("экспресс")

const приложение = экспресс ()

app.listen (5000, () => {
console.log («Сервер запущен!»)
})  

Сначала мы импортируем наш пакет express , который мы только что установили. Затем создайте новый экспресс-экземпляр и поместите его в переменную app . Эта переменная app позволяет нам делать все необходимое для настройки нашего REST API, например регистрировать наши маршруты, устанавливать необходимое промежуточное ПО и многое другое.

Попробуйте запустить наш сервер, выполнив эту команду ниже.

  $ узел index.js
Сервер запущен!  

В качестве альтернативы мы можем настроить новый сценарий npm, чтобы упростить наш рабочий процесс.

package.json

  {
"scripts": {
"начало": "узел index.js"
}
}  

Затем мы можем запустить наш сервер, выполнив npm start .

  $ npm start
Сервер запущен!  

Настройка мангуста

Mongoose — наиболее предпочтительная оболочка MongoDB для Node.js. Это позволяет нам легко взаимодействовать с базой данных MongoDB. Мы можем начать подключать наш сервер к нашей базе данных MongoDB.

index.js

  const express = require ("экспресс")
const mongoose = require ("мангуст")


мангуста
.connect ("mongodb: // localhost: 27017 / acmedb", {useNewUrlParser: true})
.then (() => {
const приложение = экспресс ()

app.listen (5000, () => {
console.log («Сервер запущен!»)
})
})  

Здесь мы импортируем пакет mongoose и используем его для подключения к нашей базе данных под названием acmedb , но вы можете назвать его как хотите.Если вы еще не создали эту базу данных, не волнуйтесь, мангуст создаст ее за вас.

Метод connect возвращает обещание, поэтому мы можем дождаться его разрешения и запустить наш Express-сервер.

Снова запустите сервер и убедитесь, что нет ошибок.

  $ npm start
Сервер запущен!  

Теперь мы успешно подключили наш сервер к базе данных, теперь пора создать нашу первую модель.

Мангуст модель

В мире NoSQL все данные хранятся в одном документе.А несколько документов одного типа можно объединить в коллекцию.

Model — это класс, который позволяет нам взаимодействовать с определенной коллекцией базы данных.

Определение модели также требует от нас определения схемы. Схема в основном сообщает модели, как должен выглядеть наш документ. Несмотря на то, что в мире NoSQL схема документа является гибкой, mongoose помогает нам сохранять наши данные более согласованными.

Допустим, у нас есть API блога. Итак, очевидно, что у нас будет модель Post .А у пост-модели есть схема, содержащая поля, которые можно добавить в один документ. В этом примере у нас будет просто поле title и content .

Итак, давайте добавим в наш проект новую папку с именем models и создадим внутри нее файл с именем Post.js .

модели / Post.js

  const mongoose = require ("мангуст")

const schema = mongoose.Schema ({
название: Строка,
содержание: Строка,
})

модуль.export = mongoose.model ("Сообщение", схема)  

Здесь мы создаем схему с использованием mongoose.Schema и определяем поля, а также типы данных. Затем мы создаем новую модель, используя mongoose.model на основе только что созданной схемы.

Получить все сообщения

Здесь мы можем создать новый файл с именем routes.js , который будет содержать наши экспресс-маршруты.

routes.js

  const express = require ("экспресс")
const router = экспресс.Маршрутизатор ()

module.exports = маршрутизатор  

Нам также нужно импортировать express , но на этот раз мы хотим использовать express.Router . Это позволяет нам регистрировать маршруты и использовать их в нашем приложении (в index.js ).

Теперь мы готовы создать наш первый маршрут в Express, который действительно что-то делает!

Давайте создадим маршрут, который может получить список существующих сообщений.

routes.js

  const express = require ("экспресс")
const Post = require ("./ models / Post »)
const router = express.Router ()


router.get ("/ posts", async (req, res) => {
const posts = ждать Post.find ()
res.send (сообщения)
})

module.exports = маршрутизатор  

Здесь мы импортируем модель Post и создаем новый маршрут GET с помощью метода router.get . Этот метод примет конечную точку маршрута и обработчик маршрута, чтобы определить, какие данные должны быть отправлены клиенту. В этом случае мы собираемся получить все наши сообщения с помощью find из нашей модели и отправить результат с разрешением res.отправить метод .

Поскольку получение документов из базы данных является асинхронным, нам нужно использовать await , чтобы дождаться завершения операции. Итак, не забудьте пометить свою функцию как async . Затем, после того, как данные будут полностью извлечены, мы можем отправить их клиенту.

Теперь мы можем установить наши маршруты в наш index.js .

index.js

  const express = require ("экспресс")
const mongoose = require ("мангуст")
const routes = require ("./ routes ")

мангуста
.connect ("mongodb: // localhost: 27017 / acmedb", {useNewUrlParser: true})
.then (() => {
const приложение = экспресс ()
app.use ("/ api", маршруты)

app.listen (5000, () => {
console.log («Сервер запущен!»)
})
})  

Сначала мы импортируем файл ./routes.js , чтобы получить все маршруты, и регистрируем его с помощью app. Используйте метод с префиксом / api , Итак, все наши сообщения доступны в / api / посты .

Попробуйте запустить наш сервер и получить / api / posts , посмотрим, что у нас получилось.

  $ curl http: // localhost: 5000 / api / posts
[]  

Теперь у нас есть пустой массив с нашего сервера. Это потому, что мы еще не создали ни одной публикации. Так почему бы не создать его?

Создать сообщение

Чтобы создать сообщение, нам нужно принять запросов POST от / api / posts .

routes.js

 

router.post ("/ posts", async (req, res) => {
const post = new Post ({
title: req.body.title,
content: req.body.content,
})
жду поста.спасти()
res.send (сообщение)
})  

Здесь мы создаем новый объект Post и заполняем поля из свойства req.body . Объект req содержит данные запроса клиента, и тело является одним из них.

Затем нам также нужно сохранить нашу запись с помощью метода save . Сохранение данных также является асинхронным, поэтому нам нужно использовать синтаксис async / await.

По умолчанию Express не умеет читать тело запроса. Итак, нам нужно добавить промежуточное ПО, чтобы иметь возможность анализировать их в каждом отдельном запросе.Таким образом, наше тело запроса будет доступно в наших обработчиках маршрутов через req.body .

index.js

  const express = require ("экспресс")
const mongoose = require ("мангуст")
const routes = require ("./ routes")

мангуста
.connect ("mongodb: // localhost: 27017 / acmedb", {useNewUrlParser: true})
.then (() => {
const приложение = экспресс ()
app.use (express.json ())
app.use ("/ api", маршруты)

app.listen (5000, () => {
console.log («Сервер запущен!»)
})
})  

Давайте протестируем функцию создания сообщений, которую мы только что создали!

  $ curl http: // localhost: 5000 / api / posts \
    -X POST \
    -H "Content-Type: application / json" \
    -d '{"title": "Сообщение 1", "content": "Lorem ipsum"}'
{
    "_v": 0,
    "_id": ,
    "title": "Сообщение 1",
    "content": "Lorem ipsum"
}  

Получить индивидуальный пост

Чтобы получить отдельный пост, нам нужно создать новый маршрут с помощью метода GET .

routes.js

 

router.get ("/ posts /: id", async (req, res) => {
const post = await Post.findOne ({_id: req.params.id})
res.send (сообщение)
})  

Здесь мы регистрируем новый маршрут с конечной точкой / posts /: id . Это называется параметром URL, он позволяет нам получить id нашего сообщения в обработчике маршрута. Потому что у каждого отдельного документа, который мы храним в нашей базе данных, есть собственный уникальный идентификатор, называемый ObjectID .И мы можем найти его с помощью метода findOne и передать идентификатор из объекта req.params .

Отлично, теперь попробуйте получить одну запись в блоге с помощью нашего HTTP-клиента.

  $ curl http: // localhost: 5000 / api / posts / 
{
  "_id": ,
  "title": "Сообщение 1",
  "content": "Lorem ipsum"
}  

Похоже, он работает, но есть одна вещь.

Если мы перейдем к этому маршруту и ​​передадим неправильный ObjectID, наш сервер выйдет из строя.И причина, по которой он не работает, заключается в том, что, когда мы получаем одно сообщение с несуществующим ObjectID, обещание отклоняется, и наше приложение перестает работать.

Разное

Добавить комментарий

Ваш адрес email не будет опубликован.