6
votes

AWS API Gateway Websocket UnknownError

Nous rencontrons une erreur lors d'un appel SDK postToConnection () en guise de promesse, tous les détails de l'erreur sont donnés ci-dessous. D'autres appels dans la même fonction avec un ID de connexion différent se produisent avec succès. Les 410 erreurs de connexion attendues se produisent correctement et en millisecondes et sont gérées correctement.

Cette erreur prend alors entre 40 secondes et bien plus d'une minute pour être renvoyée, ce qui provoque toujours des erreurs de «délai d'expiration de la demande de point de terminaison» dans l'API Web socket car il a un délai d'expiration de demande maximal de 30 secondes. Quelqu'un a-t-il déjà rencontré ce problème et / ou une solution a-t-elle été mise en œuvre? Toutes les idées pour résoudre le problème seront très appréciées, merci.

UnknownError: Erreur réseau lors de la communication avec le point de terminaison à Object.extractError (/opt/nodejs/node_modules/aws-sdk/lib/protocol/json.js:51:27)


0 commentaires

3 Réponses :


6
votes

essayez-vous d'utiliser postToConnection dans le gestionnaire de connexion? La connexion websocket n'est créée que après que le gestionnaire de connexion a renvoyé statusCode 200. Vous ne devez pas utiliser postToConnection dans le gestionnaire de connexion.


2 commentaires

Merci pour la suggestion ci-dessus, cela fonctionne maintenant comme prévu!


comment envoyer un message à un client qui vient de se connecter alors? :)



0
votes

Cette erreur est générée lors de l'appel de .postToConnection en réponse à un événement $ connect. Vous pouvez appeler .postConnection sans erreur en réponse à un événement $ 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"
            });

        })

    }

};


0 commentaires

3
votes

Pour éviter un mal de tête 410 lors de l'utilisation de websockets sur sans serveur, n'oubliez pas de saisir vos exceptions:

if (event.requestContext.stage == 'local') {
              await ApiGatewayConnector(event)
              .postToConnection({ ConnectionId, Data })
              .promise()
              .catch(_ => removeId(ConnectionId));<----- N.B. Remove disconnected IDs
            } else {
              await ws.send(Data, ConnectionId)
            }
}
        

....

export const ApiGatewayConnector = (event) => {

  const endpoint = process.env.IS_OFFLINE
            ? 'http://localhost:3001'
            : `${event.requestContext.domainName}/${event.requestContext.stage}`
            const apiVersion = '2018-11-29'
            return new AWS.ApiGatewayManagementApi({ apiVersion, endpoint })
}


0 commentaires