java - 从 Node.js 调用 Java Lambda 函数

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

我有一个用 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 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.
}

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

关于java - 从 Node.js 调用 Java Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692882/

相关文章:

java - 响应式(Reactive) Spring Data Mongodb 查询在不应该返回旧数据的情况下返回旧数据

java - 如何将服务器证书添加到本地受信任的 Java keystore ?

json - 如何在 Swift 5 中从 URL 访问 JSON 数据

java - 什么数据类型可以用来保存阶乘 100,000,000 的值?

java - 缺少一些代码;具有 Add() 和 Remove() 方法的 ArrayList 模式

node.js - 如何在使用 Node 的进程的退出回调中等待 setTimeout?

javascript - contenteditable 的用途是什么?我可以将其用作编辑个人资料按钮吗

node.js - Nodejs Github api gist create - 接收Socket挂起

javascript - Ajax 响应未定义或奇怪

javascript - Nodejs- TypeError : JSON. Parse,JSON.Stringify 不是函数