node.js - NodeJS Lambda 调用错误:无法对响应正文进行字符串化
问题描述
创建了一个 Lambda 函数以从 AWS Textract API 获取分析。这是相关代码(Node.js 12)
exports.handler = async (event, context, callback) => {
...
let request = textract.getDocumentAnalysis(params);
request.send((err, data) => {
if (err) console.log(err, err.stack);
else console.log(data);
});
callback(null, request);
};
在 CloudWatch 日志中收到此错误:
ERROR Invoke Error
{
"errorType": "Error",
"errorMessage": "Unable to stringify response body",
"stack": [
"Error: Unable to stringify response body",
" at _trySerializeResponse (/var/runtime/RAPIDClient.js:175:11)",
" at RAPIDClient.postInvocationResponse (/var/runtime/RAPIDClient.js:45:22)",
" at complete (/var/runtime/CallbackContext.js:33:12)",
" at callback (/var/runtime/CallbackContext.js:43:7)",
" at /var/runtime/CallbackContext.js:104:16",
" at Runtime.exports.handler (/var/task/index.js:92:5)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
当我修改回调时: callback(null, request.X) ... lambda 从 Textract 返回数据对象。起初我认为我必须深入研究数据对象(request.DocumentMetadata)......但可以处理我放在“请求”前面的任何字符串。(至少我尝试过的那些)。对此的任何帮助表示赞赏。
解决方案
由于密切关注 AWS SDK API 文档,我使用了上述方法。但是,我找到了另一种方法,它解决了所有问题(很多问题)。也许有人可以解释原因。
这是解决方案。
let results = await textract.getDocumentAnalysis(params, (err, data) => {
if(err) console.log(err, err.stack);
else console.log(data);
}).promise();
callback(null, results);
答案与 aws-skd(用于 js)有关。这是网址: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#promise-property[][1]
对于任何异步请求(认为所有或大多数 AWS api 请求都是异步的),您需要一个 Promise...then。使用 AWS 请求,您需要一个“thenable”承诺……所以在请求的末尾添加:promise()
直接来自 AWS 文档,我认为这可能有点神秘:
var request = s3.putObject({Bucket: 'bucket', Key: 'key'});
var result = request.promise();
result.then(function(data) { ... }, function(error) { ... });
如果我要这样写上面的内容:
async function(){
const params = {Bucket: 'bucket', Key: 'key'};
await s3.putObject(params, (err, data) => {
if (err) function(err){ ... };
else function(data) { ... };
}).promise();
};
推荐阅读
- reactjs - 测试 Apollo - 一个查询有多个结果
- javascript - 功能组件的返回语句允许的语法?(反应)
- typescript - 打字稿,DDD:验证
- windows - rustc/cargo 未被识别为内部或外部命令
- c# - 如何使用 dbContext 和 MySQL 数据库登录 MVC Web 应用程序
- flutter - 如何将 Future 的返回添加到 StreamController 接收器?
- javascript - axios 随机 url 选择
- python - 创建一个张量,其中每个条目都是其索引的函数
- mysql - 尝试在 MySql 中创建用户和授予权限时出错
- r-exams - 只有在 R-exams 中满足条件时如何执行语句