Jav*_*sVA 5 protocol-buffers node.js aws-lambda protobuf.js
我需要将 protobuf 数据发送到用 Node.js 编写的 AWS Lambda。我正在尝试“Hello World”示例,其中序列化和反序列化 Person 消息。示例:person.proto
syntax = "proto3";
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
Run Code Online (Sandbox Code Playgroud)
使用 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));
Run Code Online (Sandbox Code Playgroud)
输出:
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"
}
Run Code Online (Sandbox Code Playgroud)
我想使用 Postman 将 person.pb 文件中的二进制 protobuf 数据上传到 AWS Lambda,并在 Lambda 中对其进行反序列化。当我将正文指定为“二进制”类型并指定 person.pb 文件时,人员数据在 Lambda 事件正文中显示为:
"body": "\b*\u0012\u0004Fred\u001a\ffred@foo.com"
Run Code Online (Sandbox Code Playgroud)
看起来像是转换成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>
Run Code Online (Sandbox Code Playgroud)
这样我就可以将其反序列化回 Lambda 代码中的 JSON 对象?
我将 .proto 文件生成的代码放入 Lambda 中,这样我就可以调用:
let bufferFromEvent = event.body; <== how do I get a buffer from this?
let decodedPerson = personProtos.Person.decode(bufferFromEvent);
Run Code Online (Sandbox Code Playgroud)
谢谢
小智 0
答案是丹尼尔在你的问题下面的评论中提到的。需要使用Node提供的Buffer类。
您的 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"
};
Run Code Online (Sandbox Code Playgroud)
};
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |