NodeJS Lambda调用错误:无法将响应体序列化为字符串

9

创建了一个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)...但实际上只要我在“request.”前面输入任何字符(至少是我尝试过的字符),它就可以正常工作了。感谢任何帮助。

1个回答

8
我之前使用了上述方法,因为我密切遵循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...所以在请求结尾处添加: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();
};

调用AWS SDK中的函数时,例如我正在使用的AWS.Rekognition,始终期望一个Promise。 - Fabian Rios
@Mark。我也遇到了同样的问题。我正在从Aurora DB中获取数据,类似于这样:const data = await rdsDataService.executeStatement(params, (err, res) => { if (err) console.log(err.stack); else console.log(res)}).promise(); callback(null, data)。但它开始出现错误“4fdb13任务在6.01秒后超时”。如果我删除promise(),那么也没有任何区别。超时错误仍然存在。你能帮忙吗? - program_bumble_bee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接