node.js - 解析节点js中的数据后未定义
问题描述
我正在尝试将图像从 AWS lambda 函数上传到 S3。为此,我遵循了本教程 -链接。我使用 API Gateway 创建了一个发布 API,并在 lambda 中编写了 nodejs 代码以将图像发布到 S3。但是我在尝试测试 API 时遇到了来自 API Gateway 的错误。
"errorType": "TypeError [ERR_INVALID_ARG_TYPE]",
"errorMessage": "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type undefined",
"code": "ERR_INVALID_ARG_TYPE",
"stack": [
"TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type undefined",
" at Function.from (buffer.js:207:11)",
" at Runtime.exports.handler (/var/task/index.js:17:32)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:63:25)",
" at process._tickCallback (internal/process/next_tick.js:68:7)"
我的 lambda 代码如下所示:-
const AWS = require('aws-sdk');
//*/ get reference to S3 client
var s3 = new AWS.S3();
exports.handler = (event, context, callback) => {
let encodedImage =JSON.parse(event.body).user_avatar;
let decodedImage = Buffer.from(encodedImage, 'base64');
var filePath = "avatars/" + event.queryStringParameters.username + ".jpg"
var params = {
"Body": decodedImage,
"Bucket": "find-my-mate-hasangi",
"Key": filePath
};
s3.upload(params, function(err, data){
if(err) {
callback(err, null);
} else {
let response = {
"statusCode": 200,
"headers": {
"my_header": "my_value"
},
"body": JSON.stringify(data),
"isBase64Encoded": false
};
callback(null, response);
}
});
};
我在下面的行中收到错误:-
let decodedImage = Buffer.from(encodedImage, 'base64');
我从 API Gateway 传递以下正文:-
{
"body": {
"user_avatar": "asas"
}
}
- 更新:在评论中提出建议后,我尝试了一些调试
console.log( event.body); // Output: { "body": { "user_avatar": "Hi There!" } } console.log( JSON.parse(event.body)); // Output: { body: { user_avatar: 'Hi There' } } console.log( event.body.user_avatar); // Output: undefined console.log( JSON.parse(event.body).user_avatar); // Output: undefined
代码是用 Node JS v6.10 编写的,lambda 中不再提供。所以我使用的是 Node JS v10.x。这可能是错误的原因吗?任何人都知道如何解决该错误。
解决方案
您传递的所有数据都存在于event.body
. 由于您传递的对象也是从 开始的body
,因此您应该像这样访问它:
JSON.parse(event.body).body.user_avatar
推荐阅读
- google-drive-api - 通过 Postman 批量请求 Google Drive API 权限时出现 500 内部未知错误
- jasmine - 茉莉花浏览器运行程序可以与终端记者一起使用吗?或其他测试输出方式
- java - MissingResourceException:找不到捆绑包
- node.js - 从 npm 脚本运行 docker 不起作用
- jquery - 为 TokenAuthentication DRF 安全地从 jQuery Ajax 调用访问令牌
- soap - 无法请求 TokenCreateRQ 1.0.0
- javascript - 当fancybox 打开并处于活动状态时,jQuery 不起作用
- tsql - 重组数据以输出 TSQL 中疾病报告的疾病周期
- concurrency - Cassandra 行顺序与集群键的一致性
- javascript - 克隆节点上的 JavaScript 清除文本框