首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS Lambda调用错误:无法对响应正文进行字符串化

问NodeJS Lambda调用错误:无法对响应正文进行字符串化
EN

Stack Overflow用户
提问于 2020-09-11 06:44:06
回答 1查看 5.1K关注 0票数 7

已创建Lambda函数以从AWS Textract API获取分析。以下是相关代码(Node.js 12)

代码语言:javascript
复制
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日志中,会出现以下错误:

代码语言:javascript
复制
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”前面的任何字符串。(至少是我试过的那些)。在这方面的任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-11 08:25:47

我之所以使用上述方法,是因为我密切关注AWS SDK API文档。然而,我发现了另一种方法,它解决了所有问题(很多问题)。也许有人能解释一下原因。

以下是解决方案。

代码语言:javascript
复制
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文档,我认为这可能有点神秘:

代码语言:javascript
复制
var request = s3.putObject({Bucket: 'bucket', Key: 'key'});
var result = request.promise();
result.then(function(data) { ... }, function(error) { ... });

如果我这样写上面的代码:

代码语言:javascript
复制
async function(){
  const params = {Bucket: 'bucket', Key: 'key'};
  await s3.putObject(params, (err, data) => {
    if (err) function(err){ ... }; 
    else function(data) { ... };
  }).promise();
};
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63838583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档