首页 > 解决方案 > 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)......但可以处理我放在“请求”前面的任何字符串。(至少我尝试过的那些)。对此的任何帮助表示赞赏。

标签: node.jsaws-lambdacallback

解决方案


由于密切关注 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();
};

推荐阅读