0
votes

Erreur de passerelle d'API AWS LAMBDA «Réponse de proxy Lambda malformée» Erreur d'état 502

J'essaie de créer une fonction dans NODE.js sur AWS.Lamda-service, et le test sur la console de fonction fonctionne bien, mais il ne peut pas être exporté à l'extérieur lorsque l'API serait appelée, erreur de passerelle API «Réponse de proxy Lambda malformée» Erreur de statut € 502

Le code est comme ci-dessous:

exports.handler = (event, context, callback) => {
    event.options = {
        'method': 'GET',
        'hostname': 'app.respond.io',
        'path': '/api/v1/contact/YXM2UJRaFBEdz09',
        'headers': {
            'Authorization': 'Bearer 529485f027b408ae91799eec57a53e0ac4',
            'Content-Type': 'Application/json'
        },
        'maxRedirects': 20
    }; 
    const req = https.request(event.options, (res) => {
        let body = '';
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => {
            console.log('Successfully processed HTTPS response');
            if (res.headers['content-type'] === 'application/json') {
                body = JSON.parse(body);
                body = body.data.custom_fields.discount;
                body = body.replace("%","");
             }
            callback(null, body);
       });
    });
    req.on('error', callback);
    req.write(JSON.stringify(event.data));
    req.write(JSON.stringify(event.data));
    req.end();
};

une idée


0 commentaires

3 Réponses :


1
votes

Je pense que cette erreur apparaît parce que votre réponse n'est pas formatée correctement ou plutôt que le rappel n'est pas défini à la fin. Vous devez avoir votre réponse comme ci-dessous:

var response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };
callback(null, response);

Vous pouvez également vous référer à ce SO , qui a des explications pour le même problème.


1 commentaires

J'ai essayé toutes ces variantes comme @Kulasangar mentionnées mais des erreurs apparaissent toujours ...: (Quand je teste sur la console de fonction fonctionne bien .. mais la console d'application donne une erreur



0
votes

SI j'utilise la suggestion comme @Kulasangar l'a dit:

exports.handler = (event, context, callback) => {
    event.options = {
        'method': 'GET',
        'hostname': 'app.respond.io',
        'path': '/api/v1/contact/YXM2OqYUJRaFBEdz09',
        'headers': {
            'Authorization': 'Bearer 529485f027b408ae91799e6497a53e0ac4',
            'Content-Type': 'Application/json'
        },
        'maxRedirects': 20
    }; 
    const req = https.request(event.options, (res) => {
        let body = '';
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => {
            console.log('Successfully processed HTTPS response');
            if (res.headers['content-type'] === 'application/json') {
                body = JSON.parse(body);
                body = body.data.custom_fields.discount;
                body = body.replace("%","");
             }
             var response = {
               'statusCode': 200,
               'body': body,
               'isBase64Encoded': false
             };
             callback(null, JSON.stringify(response));
       });
    });
    req.on('error', callback);
    req.write(JSON.stringify(event.data));
    req.write(JSON.stringify(event.data));
    req.end();
};

Je reçois le résultat lorsque je teste sur la console de fonction comme suit:

"{" statusCode ": 200," body ":" 30 "," isBase64Encoded ": false}"

mais une erreur persiste quand j'appelle api


1 commentaires

Avez-vous également autorisé IAM à votre passerelle API pour appeler votre fonction lambda? Sinon, jetez un œil ici - amzn.to/3ppOoY7



0
votes

Enfin, j'ai résolu ce problème.

1.J'ai suivi les instructions @Kulasangar ... et une partie du problème que j'ai résolu avec sa réponse ... Donc, erreur 502 d'état de la réponse du proxy Lambda malformée , cela signifie que vous ne pouvez pas exporter la réponse de la fonction hors d'AWS Lambda.

L'une des solutions consiste à décocher Utiliser l'intégration du proxy Lambda dans la demande d'intégration d'API et à apporter des modifications aux modèles de mappage ... Il est décrit Amazon API Gateway-Documentation . Pour les débutants, il est préférable de créer une API à partir du lien avant de créer à partir de la console du concepteur. Donc, avec ces modifications, j'ai été autorisé à exporter la réponse en dehors d'AWS Lambda.

2.le deuxième problème que j'ai eu, c'était "Le premier argument doit être de type chaîne ou une instance de Buffer error" , une erreur, lorsque la réponse a été exportée en dehors d'AWS Lambda ... j'ai donc changé les lignes suivantes:

var https = require('https');
/**
 * Pass the data to send as `event.data`, and the request options as
 * `event.options`. For more information see the HTTPS module documentation
 * at https://nodejs.org/api/https.html.
 *
 * Will succeed with the response body.
 */
exports.handler =  (event, context, callback) => {
    event.options = {
        'method': 'GET',
        'hostname': 'app.respond.io',
        'path': '/api/v1/contact/YXM2cTRaktpVFBEdz09',
        'headers': {
            'Authorization': 'Bearer 52948ae917902a15e8ff2d0d2b816e1046497a53e0ac4',
            'Content-Type': 'Application/json'
        },
        'maxRedirects': 20
    }; 
    const req = https.request(event.options, (res) => {
        let body = '';
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => {
            console.log('Successfully processed HTTPS response');
            // If we know it's JSON, parse it
            if (res.headers['content-type'] === 'application/json') {
                body = JSON.parse(body);
                body = body.data.custom_fields.discount;
                body = body.replace("%","");
              }
        const response = {
        'statusCode': 200,
        'body': body //,
        //'isBase64Encoded': false
        };
            callback(null, JSON.stringify(response);
        });
    });
    req.on('error', callback);
    //req.write(JSON.stringify(event.data));
    //req.write(JSON.stringify(event.data));
    req.write(JSON.stringify(event));
    req.write(JSON.stringify(event));
    req.end();
};

Avant tout cela, j'ai défini certains paramètres d' autorisation IAM sur API Gateway lorsque j'essayais de résoudre le problème, mais je ne sais pas lequel pourrait être lié aux erreurs ci-dessus ... donc si quelqu'un a toujours un problème devrait vérifier ces paramètres ...

Le code final est donc:

    // from: 
    //req.write(JSON.stringify(event.data));
    //req.write(JSON.stringify(event.data));
    // to:
    req.write(JSON.stringify(event));
    req.write(JSON.stringify(event));


0 commentaires