已创建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: callback(null,request.X)时...lambda从Textract返回数据对象。我最初认为我必须深入到数据对象(request.DocumentMetadata) ...但是可以处理我放在“request”前面的任何字符串。(至少是我试过的那些)。在这方面的任何帮助都是非常感谢的。
发布于 2020-09-11 08:25:47
我之所以使用上述方法,是因为我密切关注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)。下面是url: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();
};https://stackoverflow.com/questions/63838583
复制相似问题