AWS API Gateway Websocket UnknownError - PullRequest
       25

AWS API Gateway Websocket UnknownError

1 голос
/ 15 апреля 2019

При выполнении вызова SDK postToConnection() в качестве обещания возникла ошибка. Подробные сведения об ошибке приведены ниже. Другие вызовы в той же функции с другим идентификатором соединения происходят успешно. Ожидаемые ошибки соединения 410 происходят правильно и в миллисекундах и обрабатываются изящно.

В этом случае для возврата этой ошибки требуется от 40 секунд до более минуты, что всегда приводит к ошибкам «тайм-аута запроса конечной точки» в API веб-сокета, поскольку максимальное время ожидания запроса составляет 30 секунд. Кто-нибудь сталкивался с этой проблемой раньше и / или какое-либо решение реализовано? Любые идеи по решению проблемы будут высоко оценены, спасибо.

UnknownError: сетевая ошибка связи с конечной точкой в ​​Object.extractError (/opt/nodejs/node_modules/aws-sdk/lib/protocol/json.js:51:27)

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

вы пытаетесь использовать postToConnection внутри обработчика соединения?Соединение websocket создается только после обработчик соединения возвратил statusCode 200. Вы не должны использовать postToConnection внутри обработчика соединения.

0 голосов
/ 21 мая 2019

Эта ошибка возникает при вызове .postToConnection в ответ на событие $ connect. Вы можете вызвать .postConnection без ошибок в ответ на событие $ default.

// index.js
// the handler is defined as: index.handler

const AWS = require("aws-sdk");

exports.handler = function (event, context, callback) {

    console.log('event.requestContext.eventType', event && event.requestContext && event.requestContext.eventType)

    if (event.requestContext.eventType === "CONNECT") {

        console.log('$connect event')

        // calling apigwManagementApi.postToConnection will throw an exception

        callback(null, {
            statusCode: 200,
            body: "Connected"
        });

    } else if (event.requestContext.eventType === "DISCONNECT") {

        console.log('$disconnect event')

        // calling apigwManagementApi.postToConnection is pointless since the client has disconneted

        callback(null, {
            statusCode: 200,
            body: "Disconnected"
        });
    } else {

        console.log('$default event')

        const ConnectionId = event.requestContext.connectionId
        const bodyString = event.body
        const Data = bodyString

        const apigwManagementApi = new AWS.ApiGatewayManagementApi({
            apiVersion: "2018-11-29",
            endpoint: event.requestContext.domainName + "/" + event.requestContext.stage
        });

        apigwManagementApi
        .postToConnection({ ConnectionId, Data })
        .promise().then(() => {

            callback(null, {
                statusCode: 200,
                body: "Disconnected"
            });

        })

    }

};
...