2017-10-09 4 views
1

TLDR: Comment enregistrer les erreurs http 500 dans Lambda?La méthode AWS Lambda utilisant http.request n'atteint jamais l'événement d'erreur, même avec la réponse 500

Je tente de consigner les erreurs de ma méthode API interne (non accessible directement à l'abonnement SNS), appelée dans Lambda, dans CloudWatch. Voici ma méthode Lambda nodejs 6.10:

var http = require('http'); 

exports.handler = function(event, context, callback) { 
    var post_data = event.Records[0].Sns.Message; 
    var post_options = { 
     host: 'myhost.com', 
     port: 80, 
     path: '/path/to/api/', 
     method: 'POST', 
     headers: { 
      'Content-Type': 'application/json', 
      'Content-Length': post_data.length 
     } 
    }; 
    var post_request = http.request(post_options, function(res) { 
     var body = ''; 

     res.on('data', function(chunk) { 
      body += chunk; 
     }); 

     res.on('end', function() { 
      callback(null, body);//This event happens, even when server returns 500 
     }); 

     res.on('error', function(e) { 
      callback(e);//This event never gets called 
     }); 
    }); 

    post_request.on('error', function(e) { 
     callback(e);//This event never gets called either 
    }); 

    post_request.end(post_data); 
}; 

Ma méthode API renvoie une 500. Cependant, mon événement post_request.on('error') ou res.on('error') est jamais exécutée. Il exécute toujours le res.on('end') à la place.

Je voudrais signaler l'erreur complète dans cloudwatch, mais à la place il me donne juste un message d'erreur générique, tout en disant que la méthode lambda a été couronnée de succès.

Répondre

0

C'est une anomalie avec le nœud what qui considère une 'erreur'. En ce qui concerne la bibliothèque http, il n'y a pas eu d'erreur. Il s'est connecté avec succès à votre API et a renvoyé avec succès le résultat donné par le serveur. Le gestionnaire d'erreurs se déclenchera uniquement avec des erreurs TCP ou une réponse ratée. Si vous voulez un comportement raisonnable, vous devrez vérifier le code d'état sur la réponse.

var post_request = http.request(post_options, function(res) { 
    if (res.statusCode < 200 || res.statusCode > 299) 
     // handle non-200 https errors; 
    } 
    // more code 
}) 
+0

ok, cela a du sens, confondant qu'avec javascript, il ressemble à une méthode jquery ajax. laisse moi essayer ça. – Nate

+0

confirmé, désolé, il a fallu si longtemps, jour occupé! Merci encore! – Nate