【问题标题】:Uploading and Deserializing protobuf data in AWS Lambda在 AWS Lambda 中上传和反序列化 protobuf 数据
【发布时间】:2022-04-08 05:18:52
【问题描述】:

我需要将 protobuf 数据发送到用 Node.js 编写的 AWS Lambda。 我正在尝试一个“Hello World”示例,在该示例中我序列化和反序列化 Person 消息。 例子: 人.proto

syntax = "proto3";

message Person {
    required int32 id = 1;
    required string name = 2;
    optional string email = 3;
}

使用 Node.js 和包 protobufjs,我可以从 proto 文件生成代码,并将 Person 对象序列化和反序列化为文件:

let person = personProto.Person.create();
person.id = 42;
person.name = 'Fred';
person.email = "fred@foo.com";
console.log("Person BEFORE Serialze=" + JSON.stringify(person1,null,2));

// Serialize
let buffer = personProtos.Person.encode(person1).finish();
console.log(buffer);
fs.writeFileSync("person.pb", buffer, "binary");

// Deserialize
let bufferFromFile = fs.readFileSync("person.pb");
let decodedPerson = personProtos.Person.decode(bufferFromFile);
console.log("Decoded Person=\n" + JSON.stringify(decodedPerson,null,2)); 

输出:

Person BEFORE Serialize={
  "id": 42,
  "name": "Fred",
  "email": "fred@foo.com"
}
<Buffer 08 2a 12 04 46 72 65 64 1a 0c 66 72 65 64 40 66 6f 6f 2e 63 6f 6d>
Decoded Person=
{
  "id": 42,
  "name": "Fred",
  "email": "fred@foo.com"
}

使用 Postman,我想将二进制 protobuf 数据从 person.pb 文件上传到 AWS Lambda 并在 Lambda 中反序列化。 当我将正文指定为“二进制”类型并指定 person.pb 文件时,人员数据在 Lambda 事件正文中显示为:

"body": "\b*\u0012\u0004Fred\u001a\ffred@foo.com"

它看起来像是被转换成 Unicode 并编码了? 如何获取正文字符串值并将其转回 Node.js 缓冲区:

<Buffer 08 2a 12 04 46 72 65 64 1a 0c 66 72 65 64 40 66 6f 6f 2e 63 6f 6d>

以便我可以将其反序列化回我的 Lambda 代码中的 JSON 对象?

我将 .proto 文件中生成的代码放入我的 Lambda 中,以便调用:

let bufferFromEvent = event.body;  <== how do I get a buffer from this?
let decodedPerson = personProtos.Person.decode(bufferFromEvent);

谢谢

【问题讨论】:

  • 嗨,克里斯,你试过了吗 var data = new Buffer.from(event.body, 'base64'); var message2 = personProtos.Person.decode(data);

标签: node.js aws-lambda protocol-buffers protobuf.js


【解决方案1】:

答案是丹尼尔在您问题下方的评论中提到的内容。需要使用Node提供的Buffer class

然后您的 lambda 函数将如下所示。

const personProtos = require("./personProtos");

module.exports.handler = async event => {

const buffer = new Buffer.from(event.body);

console.log(personProtos.Person.decode(buffer).toObject());

return {
  statusCode: 200,
  body: "Success"
};

};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多