2016-08-02 35 views
0

Ich versuche, die Anfrage geschickt von ASP.NET Web API AWS API und verarbeiten sie mit Lambda-Funktion zu verarbeiten:Wie die JSON-Anforderung verarbeiten von ASP.NET Web API AWS Lambda geschickt mit node.js

diese

ist die Art, wie ich die REST-API in AWS eingesetzt nenne:

// Serialize our concrete class into a JSON String 
var stringPayload = await Task.Run(() => JsonConvert.SerializeObject(payload)); 
// Wrap our JSON inside a StringContent which then can be used by the HttpClient class 
var httpContent = new StringContent(stringPayload,Encoding.UTF8,"application/json"); 
using (var httpClient = new HttpClient()) { 
    // Do the actual request and await the response 
    var httpResponse = await httpClient.PostAsync("https://hosteddress-2.amazonaws.com/prod/SlashcmdIntegeration", httpContent); 
    // If the response contains content we want to read it! 
    if (httpResponse.Content != null) { 
     var responseContent = await httpResponse.Content.ReadAsStringAsync(); 
     // From here on you could deserialize the ResponseContent back again to a concrete C# type using Json.Net 
    } 
}      

dies Code in aws Lambda es zu verarbeiten:

var AWS = require('aws-sdk'); 
var qs = require('querystring'); 
var https=require('https'); 
var token; 
exports.handler = function (event, context) { 
    processEvent(event, context); 
}; 

var processEvent = function(event, context) { 
    var body = event.body; 
    var params = qs.parse(body); 
    var commandText = params.CommandText; 
    var arr = commandText.split(" "); 
    var op1 = arr[0]; 
    var op2 = arr[1]; 
    var op = arr[2]; 
    var result; 
    switch(op) { 
     case "+": 
      result = Number(op1) + Number(op2); 
      break; 
     case "-": 
      result = Number(op1) - Number(op2); 
      break; 
     case "*": 
      result = Number(op1) * Number(op2); 
      break; 
     case "/": 
      result = Number(op2)===0 ? NaN : Number(op1)/Number(op2); 
      break; 
     default: 
      result = "Invalid op"; 
    } 
    console.log('data sent'); 
    context.succeed(result); 
}; 

ich versuchte es zu debuggen undefiniert aber ich es in der Integrationsanforderung festgelegt habe und schließlich auf unter Fehlermeldung Landung:

{ „errormessage“: „Verfahren vor dem Abschluss Anforderung beendet“}

Jede Idee, auf diese Bitte?

Dank

+0

hat diese 'var body = event.body nicht bekommen; es ist nicht undefiniert', erhalten Sie den Körper in Ihrer Anfrage? – AJS

+0

@AJS. Das ist das Problem, ich denke, event.body ist nicht definiert, aber es sollte den Körper erhalten, wie ich in der Integrationsanfrage von AWS API richtig eingestellt habe. – TechnoSavvy

+0

Der Fehler bedeutet, dass die API-Anforderung fehlgeschlagen ist, da sie keine Antwort gesendet hat. – AJS

Antwort

0

Von dem, was ich von oben Code verstehen kann

{ "errormessage": "Prozess beendet, bevor Anforderung abgeschlossen"}

Dieser Fehler tritt auf, wenn Ihr Prozess nicht in der Lage ist um eine Antwort zu senden, als ein Fehler aufgetreten ist, bevor es tun konnte. Ich würde vorschlagen, dass Sie den Körper überprüfen, bevor Sie damit beginnen, es zu analysieren

var processEvent = function(event, context) { 
 
    var body = event.body; 
 
    var result; 
 
    if (body) { 
 

 
    var params = qs.parse(body); 
 
    var commandText = params.CommandText; 
 
    var arr = commandText.split(" "); 
 
    var op1 = arr[0]; 
 
    var op2 = arr[1]; 
 
    var op = arr[2]; 
 

 
    switch (op) { 
 
     case "+": 
 
     result = Number(op1) + Number(op2); 
 
     break; 
 
     case "-": 
 
     result = Number(op1) - Number(op2); 
 
     break; 
 
     case "*": 
 
     result = Number(op1) * Number(op2); 
 
     break; 
 
     case "/": 
 
     result = Number(op2) === 0 ? NaN : Number(op1)/Number(op2); 
 
     break; 
 
     default: 
 
     result = "Invalid op"; 
 
    } 
 
    } 
 

 
    console.log('data sent'); 
 
    context.succeed(result); 
 
};

Als für das, was den Fehler verursacht, ich bin nicht ganz sicher, wie ich nicht Lambda verwendet habe, ist dies rein aus NodeJS Sicht.

+0

Ich werde die Antwort aktualisieren, wenn ich irgendwelche nützliche Informationen finde, die im Zusammenhang mit Lamda – AJS

+0

in der Integrationsanforderung der API helfen könnten Ich habe die Körper Mapping-Vorlage als gegeben: {"Körper": $ input.json ('$')}, Ereignis akzeptiert es nicht in der node.js handler.i habe es gerade mit direktem Anruf wie Ereignis versucht. [Parametername] funktioniert :) – TechnoSavvy

+0

Ich fand, das ist eine nette und saubere Implementierung kann this.https: // aws.amazon.com/blogs/compute/how-to-turn-node-js-projects-into-aws-lambda-microservices-easily-with-claudiajs/ – AJS

0

Parameter Aufruf direkt von Ereignis arbeitet:

var processEvent = function(event, context) { 
     var body = event.CommandText;/*parameter name*/ 
     var result; 
     if (body) { 


     var arr = body.split(" "); 
     var op1 = arr[0]; 
     var op2 = arr[1]; 
     var op = arr[2]; 

     switch (op) { 
      case "+": 
      result = Number(op1) + Number(op2); 
      break; 
      case "-": 
      result = Number(op1) - Number(op2); 
      break; 
      case "*": 
      result = Number(op1) * Number(op2); 
      break; 
      case "/": 
      result = Number(op2) === 0 ? NaN : Number(op1)/Number(op2); 
      break; 
      default: 
      result = "Invalid op"; 
     } 
     } 

     console.log('data sent'); 
     context.succeed(result); 
    }; 

nur wundern über die Verwendung von Body-Mapping-Vorlage.