2017-09-26 1 views
0

Ceci est la fonction aws lambda qui invoquera une api:NodeJS appel API renvoyant undefined à la fonction lambda

'use strict'; 

var request = require("request") 

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



let url = "https://3sawt0jvzf.execute-api.us-east-1.amazonaws.com/prod/test" 

request({ 
    url: url, 
    method: "POST", 
    json: event, 

}, function (error, response, body) { 
    if (!error && response.statusCode === 200) { 
     callback(null, { "isBase64Encoded": true|false, 
          "statusCode": "200", 
          "headers": { "headerName": "headerValue"}, 
          "body": body}); 
    } 
    else { 

     console.log("error: " + error) 
     console.log("response.statusCode: " + response.statusCode) 
     console.log("response.statusText: " + response.statusText) 
    } 
}) 
}; 

Ceci est l'api écrite comme une fonction aws lambda:

'use strict'; 


exports.handler = function(event, context, callback) { 
console.log(event.name); 
callback(null, { "isBase64Encoded": true|false, 
       "statusCode": "200", 
       "headers": { "headerName": "headerValue"}, 
       "body": `Hello World ${event.name}`}); // SUCCESS with message 
}; 

Quand je essayez d'appeler l'API de la fonction lambda, elle renvoie simplement "Hello World undefined". Il n'ajoute pas le nom à la fin et renvoie la réponse correcte.

+0

console.log (event.name); Est-ce que cette notation est correcte? –

+0

@VijayanathViswanathan oui – RagingBull

+0

'console.log (event.name)' fonctionne mais pas $ {event.name} '? Quelque chose ne va pas. – dashmug

Répondre

1

Hypothèses:

  • Vous utilisez Lambda-Proxy d'intégration.
  • Vous voulez passer la même charge utile exact que la première Lambda a reçu la deuxième Lambda. *

Vous comprenez mal ce event vous est. Ce n'est pas la charge utile JSON que vous avez envoyée via votre requête HTTP.

Une requête HTTP via la passerelle API se transforme en un objet event semblable à ceci:

{ 
    "resource": "Resource path", 
    "path": "Path parameter", 
    "httpMethod": "Incoming request's method name" 
    "headers": {Incoming request headers} 
    "queryStringParameters": {query string parameters } 
    "pathParameters": {path parameters} 
    "stageVariables": {Applicable stage variables} 
    "requestContext": {Request context, including authorizer-returned key-value pairs} 
    "body": "A JSON string of the request payload." 
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode" 
} 

Comme vous pouvez le voir, la charge utile JSON est accessible sous une forme dans event.body de chaîne de caractères.

Si vous voulez envoyer la même charge utile à la seconde Lambda, vous devez d'abord l'analyser.

const body = JSON.parse(event.body) 

Ensuite, envoyez body au lieu de event.

Puis, dans votre deuxième Lambda, vous analysez le JSON stringifié dans event.body, puis vous récupérez votre charge utile d'origine.

Si vous avez envoyé name dans cette charge utile d'origine, vous pouvez l'obtenir à partir de JSON.parse(event.body).name.

Référence: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

+0

Cela ne fonctionne toujours pas – RagingBull

+0

Les deux instructions console.log ci-dessus fonctionnent correctement. Ce que je voulais dire était ceci: JSON.parse (event) est nit m'aider car il montre une erreur ce qui veut dire qu'il est déjà un objet Quand je teste l'api dans la console lambda il donne une réponse correcte mais en l'invoquant depuis le navigateur ou une autre fonction lambda, il affiche Hello world undefined. – RagingBull

+0

J'ai effectué une modification dans le fichier json qui est en cours de transmission – RagingBull

0

eu un problème similaire et débogué avec l'événement de l'exploitation forestière à la console.

Ajouter la connexion sur l'événement,

console.log (JSON.stringify (event));

pour évaluer comment le mappage est effectué dans votre intégration API-Gateway à Lambda et voir où le paramètre post existe.

Si la valeur de poste n'est pas là, corrigez l'intégration jusqu'à ce que vous obteniez les valeurs de poste dans votre événement.

Cartographie des données API passerelle Lambda:

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

Hope it helps.

+0

Cela ne fonctionne pas – RagingBull

+0

Qu'est-ce qui ne fonctionne pas? Journal de la console? – Kannaiyan

+0

Les deux instructions console.log ci-dessus fonctionnent très bien. Ce que je voulais dire était ceci: JSON.parse (event) est nit m'aider car il montre une erreur qui signifie qu'il est déjà un objet. Quand je teste l'api dans la console lambda alors il donne une réponse correcte mais en l'invoquant depuis le navigateur ou une autre fonction lambda, il affiche Hello world undefined. – RagingBull