node.js - S3 API 的 getObject 回调中没有任何内容在 Lambda 函数中运行
问题描述
我遇到了一个问题,我无法从 S3 读取我的文件......甚至无法进入 S3 回调。我正在为我的 lambda 使用节点 8.10,并且我已经验证了一切都在运行,直到我尝试进入 getObject ——console.log
下面甚至不会运行。这里有什么看起来歪斜的吗?我已授予对 lambda 和 S3 的完全访问权限,所以我认为这不是问题所在。
const AWS = require('aws-sdk')
exports.handler = async (event, context, callback) => {
const s3options = {
accessKeyId: process.env.AWS_KEY,
secretAccessKey: process.env.AWS_SECRET,
apiVersion: '2006-03-01',
}
const params = {
Bucket: event.Records[0].s3.bucket.name,
Key: event.Records[0].s3.object.key,
}
const s3 = new AWS.S3(s3options)
s3.getObject(params, (err, data) => {
// callback(null, data.Body.toString('utf-8'))
console.log('I am here!')
})
}
解决方案
如果你尝试使用Node v8.x 的async/await特性,那么你必须将你的代码包装到try / catch块中并使用一个 promise(我的意思是没有必要包装你的函数代码,但你仍然必须实现 try /catch 应用程序内的块)。
注意:AWS-SDK 已经承诺,意味着您不必承诺 AWS-SDK 方法或使用回调。只需简单地将.promise()作为尾部附加到您的方法,并将await关键字作为前缀添加到您尝试调用的方法。
例子:
前:
s3.getObject(params, (err, data) => {
// callback(null, data.Body.toString('utf-8'))
后:
try
{
const s3Response = await s3.getObject(params).promise();
// if succeed
// handle response here
}
catch (ex)
{
// if failed
// handle response here (obv: ex object)
// you can simply use logging
console.error(ex);
}
然后您的代码必须如下所示:
// it's really cool to use ES6 syntax to import modules: import * as AWS from 'aws-sdk';
// btw, you don't have to import AWS-SDK inside the handler file
// const AWS = require('aws-sdk')
exports.handler = async (event) => {
const s3options =
{
accessKeyId: process.env.AWS_KEY,
secretAccessKey: process.env.AWS_SECRET,
apiVersion: '2006-03-01',
// do not forget include a region (e.g. { region: 'us-west-1' })
}
const params =
{
Bucket: event.Records[0].s3.bucket.name,
Key: event.Records[0].s3.object.key,
}
const s3 = new AWS.S3(s3options)
try
{
const s3Response = await s3.getObject(params).promise();
// if succeed
// handle response here
}
catch (ex)
{
// if failed
// handle response here (obv: ex object)
// you can simply use logging
console.error(ex);
}
}
推荐阅读
- python - 在 kivy 中非常频繁地运行函数 (Kivy Clock/FreeClock)
- json - JSON 和 Scala 解析器
- html - CSS填充父高度并保留
- jquery - 未捕获的 TypeError: $(...).lightGallery(...).destroy 不是函数
- android - RecyclerView的透明背景
- javascript - 键位功能不起作用
- c# - 代码没有进入具体方法
- python - 如何将 16 位二进制文件转换为 32 位文件?
- webpack - 访问 google-closure-library 方法 goog.require 和 goog.provide
- drupal-7 - drupal_mail() 返回 true 但无法发送邮件