NodeJS Lambda Invoke Error: Unable to stringify response body
NodeJS Lambda Invoke Error: Unable to stringify response body
创建了一个 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 returns 来自 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(for js)有关。这是 url:
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#promise-property[][1]
对于任何异步请求(认为所有或大部分 AWS api 请求都是异步的),您需要一个 Promise...然后。对于 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();
};
创建了一个 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 returns 来自 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(for js)有关。这是 url: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#promise-property[][1]
对于任何异步请求(认为所有或大部分 AWS api 请求都是异步的),您需要一个 Promise...然后。对于 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();
};