Javascript AWS Lambda&;节点:流式传输时写入数据-过早结束,数据丢失
我有一个Lambda函数,它是由对S3存储桶的写入触发的。它读取写入bucket的JSON文件,解析出各个记录,并将它们写入数据库 问题是;我不确定我做错了什么,因为流结束,Lambda在写入所有数据之前退出 我在可读流上处于“流动模式”,并且在db写入期间暂停/恢复。根据文档,这应该可以做到,但它没有按预期工作 Lambda处理器:Javascript AWS Lambda&;节点:流式传输时写入数据-过早结束,数据丢失,javascript,node.js,amazon-web-services,amazon-s3,node-streams,Javascript,Node.js,Amazon Web Services,Amazon S3,Node Streams,我有一个Lambda函数,它是由对S3存储桶的写入触发的。它读取写入bucket的JSON文件,解析出各个记录,并将它们写入数据库 问题是;我不确定我做错了什么,因为流结束,Lambda在写入所有数据之前退出 我在可读流上处于“流动模式”,并且在db写入期间暂停/恢复。根据文档,这应该可以做到,但它没有按预期工作 Lambda处理器: exports.handler = async (event, context) => { let result = false; try
exports.handler = async (event, context) => {
let result = false;
try {
result = await parseData(event);
} catch (e) {
console.error(e);
}
return result;
};
承诺:
const StreamArray = require("stream-json/streamers/StreamArray");
async parseData(event) {
try {
let objectStream = s3.getObject(params).createReadStream();
const streamParser = StreamArray.withParser();
return new Promise((resolve, reject) => {
objectStream.pipe(streamParser).on("data", async streamData => {
objectStream.pause();
let result = await writeData(streamData);
objectStream.resume();
}).on("finish", () => {
console.log("STREAM FINISH!");
resolve(true);
}).on("error", e => {
console.error("Stream error:", e);
reject(e);
});
});
} catch (e) {
console.error(e);
}
}
通过简单地用JSONStream交换出流json,这是一个更广泛使用的包。现在真是魅力四射
const JSONStream = require("JSONStream");
async parseData(event) {
try {
let objectStream = s3.getObject(params).createReadStream();
const streamParser = JSONStream.parse("*");
return new Promise((resolve, reject) => {
objectStream.pipe(streamParser).on("data", async streamData => {
streamParser.pause();
let result = await writeData(streamData);
streamParser.resume();
}).on("finish", () => {
console.log("STREAM FINISH!");
resolve(true);
}).on("error", e => {
console.error("Stream error:", e);
reject(e);
});
});
} catch (e) {
console.error(e);
}
}
JSON文件有多大?你真的需要流媒体吗?@jarmod它可能非常大,我无法预测它的大小,所以应该流媒体。