Как решить: преждевременное закрытие при onclosenexttick в Node.js Server? - PullRequest
0 голосов
/ 28 января 2020

Как решить эту ошибку, я запускаю Node.js с AWS IoT, а затем время от времени показывает эту ошибку:

      throw er; // Unhandled 'error' event
      ^

Error: How  (/home/ec2-user/work/nodejs_27_01/node_modules/end-of-stream/index.js:54:                                                                                                     86)
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on DeviceClient instance at:
    at MqttClient.<anonymous> (/home/ec2-user/work/nodejs_27_01/node_modules/aws-iot-device-sdk/                                                                                                     device/index.js:772:15)
    at MqttClient.emit (events.js:333:22)
    at MqttClient.EventEmitter.emit (domain.js:485:12)
    at TLSSocket.f (/home/ec2-user/work/nodejs_27_01/node_modules/once/once.js:25:25)
    at onclosenexttick (/home/ec2-user/work/nodejs_27_01/node_modules/end-of-stream/index.js:54:                                                                                                     73)

Ответы [ 3 ]

2 голосов
/ 28 января 2020

Причин может быть несколько:

Несколько подключений с одинаковым ClientId

ClientId может использоваться только для одного подключения за раз. Если вы подключаетесь с тем же clientId, когда установлено другое соединение, старое соединение прерывается (что приводит к преждевременной ошибке закрытия) и устанавливается новое соединение.

Клиент использует идентификатор клиента это уже используется. В этом случае клиент, который уже подключен, будет отключен [...]. ( Источник )

Разрешения

Эта ошибка может возникать, если устройство (mqtt.Client from aws -iot-device-sdk- js) не имеет необходимых разрешений для подключения и / или публикации / подписки / получения сообщений на заданную тему c.

Дополнительную документацию см. Здесь: https://docs.aws.amazon.com/iot/latest/developerguide/pub-sub-policy.html

Политика должна выглядеть следующим образом (пример показывает Cloudformation Iot Policy ресурс):

MyIotThingsPolicy:
  Type: AWS::IoT::Policy
  Properties:
    PolicyDocument:
      Version: "2012-10-17"
      Statement:
        - Action: iot:Connect
          Effect: Allow
          Resource: !Join [ "", [!Sub "arn:aws:iot:${AWS::Region}:${AWS::AccountId}:client/",
                                 "${iot:ClientId}"] ]
        - Action: iot:Receive
          Effect: Allow
          Resource: !Join [ "", [!Sub "arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topic/",
                                "${iot:ClientId}/eg/your/broadcast/topic"] ]
        - Action: iot:Subscribe
          Effect: Allow
          Resource: !Join [ "", [!Sub "arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topicfilter/",
                                 "${iot:ClientId}/eg/your/broadcast/topic"] ]
        - Action: iot:Publish
          Effect: Allow
          Resource: !Join [ "", [!Sub "arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topic/",
                                 "${iot:ClientId}/eg/your/publish/topic"] ]

!Join необходим, поскольку Cloudformation будет пытаться разрешить ${iot:ClientId}, которое является значением времени выполнения и неизвестно во время развертывания.

Устранение неполадок

  • Как Sandeep Patel также предлагает вам следует реализовать функцию обратного вызова с ошибкой, если вы хотите действовать в этой ситуации на стороне клиента:

    device.on('error', (error) => {
      // error.message might be 'premature close'
    });
    
  • Вы также можете искать disconnectReason в topi c $aws/events/presence/disconnected/<clientId>, см .: https://docs.aws.amazon.com/iot/latest/developerguide/life-cycle-events.html

1 голос
/ 05 февраля 2020

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

"Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ] 
0 голосов
/ 28 апреля 2020

Во время тестирования я приложил политику с полными "Action": "iot:*" разрешениями, но пропустил , чтобы активировать недавно созданный сертификат. Пожалуйста, go для основного сервиса IoT, Secure --> Certificates и убедитесь, что сертификат, прикрепленный к <Thing>, активирован, если вы получаете error Error: premature close после подтверждения подключения к конечной точке с помощью:

telnet <your-iot-endpoint> 8883.

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

enter image description here

...