Я создал java функцию для aws лямбда
public class AWSHandler implements RequestHandler<Map<String,String>, String>{
Gson gson = new GsonBuilder().setPrettyPrinting().create();
@Override
public String handleRequest(Map<String,String> event, Context context)
{
String input = event.get("input");
if(input == null) throw new RuntimeException("Payload should have an input");
// handle video and upload to s3
Map<String, String> result = new HashMap<>();
result.put("bucket", "myS3Bucket");
result.put("key", "myS3Key");
return gson.toJson(result);
}
}
Затем я запускаю свой код с nodejs
const AWS = require('aws-sdk');
const fs = require('fs');
const video = fs.readFileSync('test.mp4');
const payload = {
input: video.toString('base64')
};
var lambda = new AWS.Lambda({region: 'eu-central-1'});
var params = {
FunctionName: 'my-function',
Payload: JSON.stringify(payload)
};
lambda.invoke(params).promise()
.then(result => {
console.log(result);
})
.catch(err => {
console.log('catch');
console.error(err)
})
Если я запускаю свой код с нет input
У меня будет успех
{ StatusCode: 200,
FunctionError: 'Unhandled',
ExecutedVersion: '$LATEST',
Payload:
'{"errorMessage":"Payload should have an input","errorType":"java.lang.RuntimeException","stackTrace":["AWSHandler.handleRequest(AWSHandler.java:35)","sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)","sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)","sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)","java.lang.reflect.Method.invoke(Method.java:498)"]}' }
Я не понимаю, почему, когда мой код java выдает ошибку, ответ на запрос вызова успешен, ввод, а затем перехват
Если я запускаю его со входом
{ StatusCode: 200,
ExecutedVersion: '$LATEST',
Payload:
'"{\\n \\"bucket\\": \\"myBucket\\",\\n \\"key\\": \\"myKey\\"\\n}"' }
Полезная нагрузка кодируется дважды.
Так почему вызов не отклоняется в случае исключения или, по крайней мере, не возвращает StatusCode 200 и почему мой json кодируется дважды
Спасибо