【问题标题】:Invoke Java Lambda function from Node.js从 Node.js 调用 Java Lambda 函数
【发布时间】:2019-04-16 16:06:32
【问题描述】:

我有一个用 Java 编写的 Lambda 函数,我想从 NodeJS 调用它。这可能吗?我收到以下错误:

An error occurred during JSON parsing: java.lang.RuntimeException
java.lang.RuntimeException: An error occurred during JSON parsing
Caused by: java.io.UncheckedIOException: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
at [Source: lambdainternal.util.NativeMemoryAsInputStream@5dc0ff7d; line: 1, column: 1]
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
at [Source: lambdainternal.util.NativeMemoryAsInputStream@5dc0ff7d; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:857)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:62)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)

这是我的 Lambda 的代码:

public String handleRequest(String input, Context context) {
  context.getLogger().log("input: " + input + "\n");
  JSONObject obj = new JSONObject(input);
  String dest_key = obj.getString("key");
  context.getLogger().log("key: " + dest_key + "\n");

  ...
}

这是我调用上述 Lambda 的 JavaScript:

const AWS = require('aws-sdk');

const payload = "{\"key\": \"slide.pptx\"}"

AWS.config.loadFromPath('./config.json');
const lambda = new AWS.Lambda({ region: "ap-south-1" });
const params = {
  FunctionName : 'slide-builder',
  InvocationType : 'RequestResponse',
  Payload: payload // I get the same error even without a payload
};

lambda.invoke(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else console.log(JSON.stringify(data));
});

【问题讨论】:

    标签: java node.js json amazon-web-services aws-lambda


    【解决方案1】:

    您有两个比您现有的更好的选择。尝试获取 String 对我来说从来没有用过,因为 Java Lambda 会在您获取 JSON 有效负载之前尝试对其进行解释。

    一种选择是消除 Lambda 试图对您的输入对象进行任何解释。比如:

    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public void handleRequest(InputStream inputStream,
                              OutputStream outputStream,
                              Context context) throws IOException {
    
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(inputStream);
        String key= jsonNode.get("key").asText();
        // key will now be "slide.pptx"
    
        // create object to return...
        MyObject myObject = new MyObject();
    
        // create JSON string
        String jsonReturn = objectMapper.writeValueAsString(myObject);
    
        // "return" the string
        outputStream.write(jsonReturn .getBytes(Charset.forName("UTF-8")));
    }
    

    当 Java Lambda 尝试将传入数据转换为您想要的对象时,您所做的就是避免“帮助”。当你有一个完整的对象但在这里没有做你想做的事情时,这很有效。

    另一种选择是创建一个镜像您的 Node 对象的对象:

    public class KeyObject {
        private String key;
    
        public String getKey() {
            return key;
        }
    }
    

    然后让你的处理函数是:

    public String handleRequest(KeyObject key, Context context) {
    
        String fileName = key.getKey();
    
        // return as you're doing now.
    }
    

    我相信其中任何一个都能满足您的需求。

    【讨论】:

      【解决方案2】:

      (From this answer)

      public class LambdaFunctionHandler implements RequestHandler<Map<String,Object>, String> {
          public String handleRequest(Map<String,Object> input, Context context) {
              context.getLogger().log(input.get("key"));
              ...
          }
      }
      

      我对 stdunbar 的解决方案不太满意,但这对我有用。

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 2021-09-19
        • 2017-01-01
        相关资源
        最近更新 更多